【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]

示例 2:

输入: head = [1], n = 1
输出: []

示例 3:

输入: head = [1,2], n = 1
输出: [1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

分析解答

第一眼:这不删除节点吗?我会!

再看一眼:哎呦不对!是倒数第 n 个节点。

然后:emmm,这不一个道理吗!

所以我的思路就是先将倒序转化为正序,用正序的思路去删。如果正序为第 x 个,倒序为第 n 个,那么找找规律就可以发现 x = length + 1 - n

为了方便,依旧是引入虚拟头节点,既然要删第 x 个,那么就去找第 x - 1 个。

然后,既然没有 length,那就求呗。

let dummyHead = new ListNode(0, head)
let length = 0
while (dummyHead.next != null) {length++dummyHead = dummyHead.next
}
dummyHead = new ListNode(0, head)

之后的操作就一个非常普通的删除节点操作。

/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} n* @return {ListNode}*/
var removeNthFromEnd = function (head, n) {let dummyHead = new ListNode(0, head)let length = 0while (dummyHead.next != null) {length++dummyHead = dummyHead.next}dummyHead = new ListNode(0, head)if ((length + 1 - n) == 1) {head = head.next;}if ((length + 1 - n) == 2) {dummyHead.next.next = dummyHead.next.next.next}if ((length + 1 - n) >= 3) {for (let i = 1; i < (length + 1 - n); i++) {dummyHead = dummyHead.next;}dummyHead.next = dummyHead.next.next}return head
};

思路拓展

大家可以想一想,倒数第 n 个和正序的第 n 个有什么相同之处捏?

对了!就是首(假设为双向链表)尾都是 null!从头往后数和从尾往前数不一个道理吗?

image.png

所以思路就是找一对双指针 fast 和 slow,他们在维持一定的位移差的情况下同时移动,fast 一直指到 null(尾),而 slow 刚好是 fast 后面的第 n + 1 个元素,第 n 个刚好是要删除的元素。

image.png

/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} n* @return {ListNode}*/
var removeNthFromEnd = function(head, n) {let ret = new ListNode(0, head)let slow = ret;let fast = ret;// fast 和 slow 指针差 n + 1n++;while (n-- && fast) fast = fast.next;while (fast) {fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return ret.next;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试漏洞之XSS漏洞

目录 1.1 XSS漏洞原理 1.2 XSS漏洞分类 1.3 XSS漏洞危害 1.4 XSS漏洞的防范 1.5 XSS各类别的区别 1.1 XSS漏洞原理 Cross-site Scripting&#xff0c;简称XSS 原理&#xff1a;就是程序对输入输出没有做合理的过滤限制&#xff0c;导致攻击者构造的字符输出到前端时被浏…

Mamba入局遥感图像分割 | Samba: 首个基于SSM的遥感高分图像语义分割框架

文章目录 1、导读 2、背景 3、动机 4、方法 5、实验 6、总结 标题&#xff1a;《Samba: Semantic Segmentation of Remotely Sensed Images with State Space Model》论文&#xff1a;https://arxiv.org/abs/2404.01705源码&#xff1a;https://github.com/zhuqinfeng1999…

在展会上如何介绍产品和公司,柯桥俄语培训

1.Приглашаем Вас… 邀请您…… 2. Позвольте пригласить Вас… 请允许邀请您…… 3.Имеем честь пригласить Вас … 诚挚邀请您…… 4. Посылаем Вам приглашение на… 给您&#xff0…

Vue - 你知道Vue中key的工作原理吗

难度级别:中级及以上 提问概率:80% 在Vue项目开发中,并不推荐使用索引做为key,以为key必须是唯一的,可以使用服务端下发的唯一ID值,也不推荐使用随机值做为key,因为如果每次渲染都监听到不一样的key,那么节点将无法复用,这与Vue节省…

android gradle版本无法下载

android gradle版本无法下载问题解决方法 在引入一个新的android项目的时候&#xff0c;通常会因为无法下载gradle版本而一直卡在同步界面&#xff0c;类似于下面的情况。 这是因为gradle运行时首先会检查distributionUrlhttps://services.gradle.org/distributions/gradle-5.6…

JavaScript逆向爬虫——无限debugger的原理与绕过

debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字&#xff0c;只要遇到它&#xff0c;JavaScript 的执行便会在此处中断&#xff0c;进入调试模式。 有了 debugger 这个关键字&#xff0c;就可以非常方便地对 JavaScript 代码进行调试&#xff0c;比如使用 JavaSc…

LeetCode-热题100:139. 单词拆分

题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s “leet…

从MySQL5.7平滑升级到MySQL8.0的最佳实践分享

一、前言 升级需求&#xff1a;将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL&#xff0c;将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式&#xff0c;称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发&#xff0c;多端部署》的配套示例代码&#xff0c;展示了页面开发的一多能力&#xff0c;包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明&#xff1a; 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时&#xff0c;容…

✌2024/4/3—力扣—整数转罗马数字

代码实现&#xff1a; 方法一&#xff1a;硬编码数字 const char *thousands[] {"", "M", "MM", "MMM"}; const char *hundreds[] {"", "C", "CC", "CCC", "CD", "D",…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

ChatGPT助力学术成就:打造完美论文技巧

ChatGPT无限次数:点击直达 ChatGPT助力学术成就&#xff1a;打造完美论文技巧 在当今信息爆炸的时代&#xff0c;学术研究对于每个领域的进步和发展至关重要。而在学术研究中&#xff0c;撰写高质量的论文是展示研究成果和贡献的重要方式之一。然而&#xff0c;许多学者在论文…

如何使用Excel搭建一套低值易耗品管理系统

低值易耗品是企业日常运营中不可或缺的一部分&#xff0c;虽然其单个价值不高&#xff0c;但因其使用频繁且数量众多&#xff0c;对其的管理同样重要。利用Excel搭建一套低值易耗品管理系统&#xff0c;不仅成本低廉&#xff0c;而且易于操作和维护。本文将指导您如何使用Excel…

【编程】Boost::geometry Polygon 常用应用代码记录(C++)

简介 本文的代码部分都比较简单容易 Boost Geometry 是 Boost C 库集合的一部分&#xff0c;定义了用于解决几何问题的概念、工具和算法。这个库比较常用&#xff0c;很多现成的函数都很实用且简单&#xff0c;本文记录一些常用的函数和操作&#xff0c;重复的功能以后还会用到…

python实例1.1:编写一个程序来计算并打印用户输入的数字列表的平均值(详解及其知识点拓展)

目录 一、主程序详细讲解 二、strip()和float()函数详细用法 三、try...except详细用法 四、列表用法及append使用方法详解 append() 方法 语法&#xff1a; 实例&#xff1a; 一、主程序详细讲解 下面是一个简单的Python程序&#xff0c;它可以接收用户输入的数字列表…

Rust---模式(Pattern)匹配

目录 模式是什么它用来做什么模式匹配和赋值为什么会有模式匹配模式匹配用在什么地方match 表达式if let表达式while let表达式for 循环let 语句函数参数不可驳模式匹配和可驳模式匹配模式是什么 在Rust中,模式(Pattern)是一种用于匹配和解构数据的语法结构。模式匹配中常用…

Mac运行不畅?一招教你轻松清理缓存,恢复流畅体验!

在日常使用Mac电脑时&#xff0c;面对系统运行速度下降或频繁卡顿的问题&#xff0c;不仅影响工作效率&#xff0c;用户体验也随之大打折扣。探究 Mac 运行变慢的背后原因&#xff0c;涵盖了一系列潜在因素&#xff0c;诸如存储空间接近极限、系统资源紧张、启动加载项过多等。…

LeetCode刷题--- 让字符串成为回文串的最少插入次数

让字符串成为回文串的最少插入次数 题目链接&#xff1a;让字符串成为回文串的最少插入次数 题目 给你一个字符串 s &#xff0c;每一次操作你都可以在字符串的任意位置插入任意字符。 请你返回让 s 成为回文串的 最少操作次数 。 「回文串」是正读和反读都相同的字符串。…

EN 14246:2006 吊顶石膏板检测

石膏板是建筑领域使用的一种主要产品&#xff0c;具有重量轻&#xff0c;强度较高&#xff0c;厚度较薄&#xff0c;易加工&#xff0c;绝热隔音和防火等性能&#xff0c;是目前市场上较为流行的轻型板材之一&#xff1b;主要用于墙板&#xff0c;吊顶&#xff0c;检修口等领域…