You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
但存在一个问题,当链表长度为 n 时,fast 是前进不到 n+1 个节点位置的,所以此时有两种解决思路:
创建一个头节点 preHead ,设置 preHead.next = head ,这样就可以解决以上问题,删除倒数第 n 个节点后,返回的 preHead.next 即可
另外一种是,fast 快指针提前走 n 步后,判断 fast.next 是否为 null ,即 fast 是否是最后一个节点,如果是,则 head 为倒数第 n 个节点,此时问题可以简化为删除头节点;如果不是, fast = fast.next ,fast 再前进一步,slow 为倒数第 n+1 个节点,也解决了以上问题。
Activity
[-]leetcode876:求链表的中间结点[/-][+]leetcode19:删除链表倒数第 n 个结点[/+]taoeer commentedon Apr 14, 2020
快慢指针法
快指针先走n个节点,然后快慢指针一起,知道快指针走到null,这时慢指针指向n-1,将慢指针指向快指针。
sisterAn commentedon Apr 14, 2020
解法:快慢指针
解题思路: 需要删除链表中的倒数第
n个节点,我们需要知道的就是倒数第n+1个节点,然后删除删除倒数第n+1节点的后继节点即可步骤:
使用 2 个指针:
fast快指针提前走n+1步slow指针指向当前距离fast倒数第n个节点, 初始为head然后,
fast、slow同步向前走,直到fast.next为null此时,
fast为最后一个节点,slow就是倒数第n+1个节点,此时问题就变更为删除链表中的slow的后继节点但存在一个问题,当链表长度为
n时,fast是前进不到n+1个节点位置的,所以此时有两种解决思路:preHead,设置preHead.next = head,这样就可以解决以上问题,删除倒数第n个节点后,返回的preHead.next即可fast快指针提前走n步后,判断fast.next是否为null,即fast是否是最后一个节点,如果是,则head为倒数第n个节点,此时问题可以简化为删除头节点;如果不是,fast = fast.next,fast再前进一步,slow为倒数第n+1个节点,也解决了以上问题。解决方案一:添加
preHead节点解决方案二:单独处理倒数第
n节点时间复杂度:O(n)
空间复杂度:O(1)
leetcode
plane-hjh commentedon May 7, 2020
瓶子君,不是很明白这里
改变的是
slow,为什么返回的是headgyt95 commentedon Jul 7, 2020
因为题目要求在删除了指定节点后,需要返回的是链表的头结点。所以返回的是
head。hundren commentedon Aug 7, 2020
new ListNode(0) 这个是什么
qianlongo commentedon Aug 15, 2020
zsg857981535 commentedon Sep 14, 2020
注释写的先走的步数是不是有问题?
第一种解法: n-- 先走 n 步,
第二种解法: --n 先走n-1步
AnranS commentedon Nov 17, 2020
Anoi1018 commentedon Jan 28, 2021
借用数组存放链表节点 通过数组下标进行删除
var removeNthFromEnd = function(head, n) {
if(head === null) return null;
var arr = [];
var p = head;
while(p){
arr.push(p);
p = p.next;
}
var pos = arr.length-n;
if(pos===0) return head.next;
arr[pos-1].next = arr[pos].next;
};
Anoi1018 commentedon Jan 28, 2021
快慢指针:
var removeNthFromEnd = function(head, n) {
if(head === null) return head;
var slow = head,fast = head,count=n+1;//找到倒数第n+1个节点
//通过删除倒数第n+1个节点的后继节点来实现删除倒数第n个节点
};
azl397985856 commentedon Mar 3, 2021
题目地址(19. 删除链表的倒数第 N 个节点)
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
题目描述
前置知识
公司
思路
这里我们可以使用双指针算法,不妨设为指针 A 和 指针 B。指针 A 先移动 n 次, 指针 B 再开始移动。当 A 到达 null 的时候, 指针 B 的位置正好是倒数第 n。这个时候将 B 的指针指向 B 的下下个指针即可完成删除工作。
算法:
设置虚拟节点 dummyHead 指向 head(简化判断,使得头结点不需要特殊判断)
设定双指针 p 和 q,初始都指向虚拟节点 dummyHead
移动 q,直到 p 与 q 之间相隔的元素个数为 n
同时移动 p 与 q,直到 q 指向的为 NULL
将 p 的下一个节点指向下下个节点
(图片来自: https://github.com/MisterBooo/LeetCodeAnimation)
关键点解析
链表这种数据结构的特点和使用
使用双指针
使用一个 dummyHead 简化操作
代码
代码支持: JS, Java,CPP
Javascript Code:
Java Code:
CPP Code:
复杂度分析
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
JohnApache commentedon Apr 26, 2021
我自己用了递归回溯的方式,也是只扫描了一遍,虽然没有
快慢指针巧妙,但大家也可以参考一下jxtprivate commentedon Mar 22, 2023
你理解为slow和fast闭区间内的步数就可以了