删除链表倒数第N个节点

力扣题目链接(opens new window)

给你一个链表,删除链表的倒数第 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]

思路

最开始我是想先把链表翻转,然后遍历到第n个节点,将其删除,然后再把链表翻转并返回

这么做显然提升了代码复杂度,以至于我并没有写出逻辑正常的代码,并且我估计写出来也超时了

参考删除第n个链表节点的操作

我们可以发现:要删除某个节点,当前指针cur必须指向待删除节点的前一个节点

这样,通过将cur指向下一个节点的下一个节点就可以把待删除节点移除

明确了删除方式之后,那么如何找到倒数第n个节点?

这里需要引入双指针思想,分别定义快慢指针指向dummy

快指针fast先移动n步

然后快慢指针一起向后移动,直到快指针指向null

此时,slow指向的就是倒数第n个节点

但是根据删除节点的操作,现在的情况我们是删不了slow指向的节点的,只能删除下一个

即慢指针slow要指向待删除节点的前一个

所以快指针fast应该先走n+1步

代码

class Solution {

    public ListNode removeNthFromEnd(ListNode head, int n) {
//双指针法
//创建dummy
ListNode dummy = new ListNode(0);
dummy.next = head; //快慢指针指向dummy
ListNode fast = dummy;
ListNode slow = dummy; n++;//让fast走n+1步
for(int i = n; i > 0; i--){
if(fast == null){//避免走着走着到链表尾部的情况
break;
}
fast = fast.next;
} //快慢指针一起移动
while(fast != null){
fast = fast.next;
slow = slow.next;
}
//注意删除操作
slow.next = slow.next.next;
return dummy.next; }
}
c++版

步骤:

1、创建dummy并指向head

2、创建快慢指针并指向dummy

3、快指针先走n+1步(记得处理非法情况,如果fast为NULL就停止遍历)

4、快慢指针一块移动,当fast为空时停止

5、将当前的slow->next指向slow->next->next,返回dummy->next

class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//创建dummy
ListNode* dummy = new ListNode(0, head); ////创建快慢指针
ListNode* fast = dummy;
ListNode* slow = dummy; //快指针先走n+1步
n++;
while(n--){
//避免走着走着到链表尾部的情况
if(fast == NULL){
break;
}
fast = fast->next;
} //快慢指针一起移动
while(fast != nullptr){
fast = fast->next;
slow = slow->next;
}
//删除待删除节点
slow->next = slow->next->next;
return dummy->next;
}
};
易错点

1、为了让慢指针落在待删除节点前,快指针需要先走n+1步

并且不能写成:

for(int i = n; i > 0; i--){
if(fast == null){//避免走着走着到链表尾部的情况
break;
}
fast = fast.next;
}
fast = fast.next;

因为如果n大于链表长度,那之后就相当于对空指针进行操作了

2、删除操作

删除操作是

slow.next = slow.next.next;//让待删除节点直接等于它之后的一个节点,即代替掉要删除的节点

而不是

slow = slow.next.next;//移动slow到它的下下一个位置

3、注意要判断fast是否为空,而不是fast->next

【LeetCode链表#10】删除链表中倒数第n个节点(双指针)的更多相关文章

  1. 剑指offer-面试题22-链表中倒数第k个节点-双指针

    /* 题目: 链表中倒数第k个节点 */ /* 思路: 考虑边界条件:链表为空,k值超过链表长度. 双指针: q指针指向第k个节点,p指针指向第1个节点. q指针指向最后一个节点,p指针指向倒数第k个 ...

  2. 链表中倒数第k个节点 双指针

  3. LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)

    题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...

  4. lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

    题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...

  5. 删除链表中倒数第n个节点

    给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1 ...

  6. lintcode174 删除链表中倒数第n个节点

    删除链表中倒数第n个节点   给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2 ...

  7. LintCode-174.删除链表中倒数第n个节点

    删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 样例 给出链表 1->2->3->4->5-> ...

  8. 174. 删除链表中倒数第n个节点

    描述 笔记 数据 评测 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2-&g ...

  9. 【leetcode】19. 删除链表的倒数第N个节点

    描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变 ...

  10. LeetCode 19:删除链表的倒数第N个节点 Remove Nth Node From End of List

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. Given a linked list, remove the n-th node from the end of list and ...

随机推荐

  1. [转帖]12.计算机网络---iptables防火墙管理工具

    文章目录 一.防火墙基础知识 1.1 防火墙是什么? 1.2 iptables基础知识 1.3 netfilter和iptables的关系: 1.4 新型防火墙工具:firewalld 二.iptab ...

  2. [转帖]磁盘负载指标 %iowait, await, %util 的正确理解

    说明 %iowait, await, %util 是用来衡量硬盘负载的三个指标, 但是这几个指标通常容易被误解, 实际上, 这三个指标单纯的高, 并不一定能说明相应的磁盘有问题或者有瓶颈, 而是需要结 ...

  3. 拼多多的U盘都是垃圾

    春节期间陪孩子玩拼多多的果园, 然后发现推送的U盘很便宜就买了下 结果发现.. U盘都是扩容盘,非常垃圾 如下图: 警告: 只有 255933 MB可测试,总容量 255935 MB. 媒体很可能已损 ...

  4. element-ui表格展开行每次只能展开一行

    element-ui表格展开行每次只能展开一行 <template> <el-table :data="tableData" :expand-row-keys=& ...

  5. Gorm 入门介绍与基本使用

    Gorm 入门介绍与基本使用 目录 Gorm 入门介绍与基本使用 一.ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1 ...

  6. TienChin-课程管理-添加课程页面

    course.js 将 activity 替换成 course. index.vue 这个 index.vue 是 course 文件夹下面的 index.vue 别弄错了. <template ...

  7. 卧槽!这 5 个后端程序员学习指南竟然斩获超过 350k 的 star

    前段时间弄应届生学习指南的时候,整理了几个不错的开源文档,分享给小伙伴们!我觉得应该可以对大家有帮助. 本期文章对应的视频地址:https://www.bilibili.com/video/BV1xZ ...

  8. Linux进程间通信 [补档-2023-07-27]

    Linux进程间通信 10-1 简介 ​ 在Linux下,进程之间相互独立,每个进程都有自己不同的用户地址空间.任何一个进程的全局变量在另 一个进程中都看不到,所以进程和进程之间不能相互访问.如果非要 ...

  9. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现!话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://bl ...

  10. Java 将PDF转为PowerPoint (2行代码)

    通过编程实现PDF转PPT的功能,可以自动化转换过程,减少手动操作的工作量,并根据需要进行批量转换.将PDF文件转换为PPT文档后,可以利用PPT的丰富功能和动画效果,达到更好的演示效果. 在Java ...