【LeetCode链表#10】删除链表中倒数第n个节点(双指针)
删除链表倒数第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]
思路
最开始我是想先把链表翻转,然后遍历到第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个节点(双指针)的更多相关文章
- 剑指offer-面试题22-链表中倒数第k个节点-双指针
/* 题目: 链表中倒数第k个节点 */ /* 思路: 考虑边界条件:链表为空,k值超过链表长度. 双指针: q指针指向第k个节点,p指针指向第1个节点. q指针指向最后一个节点,p指针指向倒数第k个 ...
- 链表中倒数第k个节点 双指针
- LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)
题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...
- lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...
- 删除链表中倒数第n个节点
给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1 ...
- lintcode174 删除链表中倒数第n个节点
删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2 ...
- LintCode-174.删除链表中倒数第n个节点
删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 样例 给出链表 1->2->3->4->5-> ...
- 174. 删除链表中倒数第n个节点
描述 笔记 数据 评测 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2-&g ...
- 【leetcode】19. 删除链表的倒数第N个节点
描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变 ...
- 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 ...
随机推荐
- [转帖]ELF文件详解
一.ELF概述 1.ELF的定义 ELF(Executable and Linkable Format)文件是一种目标文件格式,常见的ELF格式文件包括:可执行文件.可重定位文件(.o).共享目标文件 ...
- [转帖]shell命令替换~date用法~如果被替换命令的输出内容包括多行或有多个连续的空白符,输出变量时应该将变量用双引号包围
https://www.cnblogs.com/mianbaoshu/p/12069458.html Shell 命令替换是指将命令的输出结果赋值给某个变量.比如,将使用ls命令查看到的某个目录中的内 ...
- [转帖]QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
https://baijiahao.baidu.com/s?id=1675704570461446033&wfr=spider&for=pc 吞吐量 在了解qps.tps.rt.并发数 ...
- RabbitMQ 测试环境的简单创建于使用 permission vhost 以及 权限简单设置
之前用docker运行起来 rabbitmq的容器了 但是今天发现有问题. 简单沟通了下 需要进行处理. 方法主要是如下 1. 运行容器: docker run --name rabbitmq -ti ...
- 【图】苹果Safari 6.0停止支持Windows PC (转载)
[图]果Safari 6.0停止支持Windows PC (转载) http://bbs.tianya.cn/post-414-41510-1.shtml 2012年之后 苹果就不在开发 window ...
- TypeScript中typeof的简单介绍
简单介绍typeof 我们都知道js提供了typeof,用来获取基本数据的类型. 实际上,TS也提供了 typeof 操作符. 可以在 [类型上下文]中进行类型查询. 只能够进行变量或者属性查询. 定 ...
- css中也可以使用变量了?
前言 大家都听说过变量,我们学习的任何语言都有变量的存在. css中是否也存在变量呢? 也许很多小伙伴也是通过less,scss中来使用css变量 其实在css中也是有变量的,今天我们也来学习一下. ...
- echarts饼状图自定义legend的样式付费
先看效果图 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- Govulncheck v1.0.0 发布了!
原文在这里 原文作者:Julie Qiu, for the Go security team 发布于 13 July 2023 我们很高兴地宣布,govulncheck v1.0.0 已经发布,同时还 ...
- RocketMQ—引言
RocketMQ-引言 MQ介绍 在学习RocketMQ之前,我们先来看以下MQ的意思. MQ是Message Queue的首字母缩写. Message:意思为消息,在我们生活中可以是一句话/一个短信 ...