删除链表的倒数第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个节点的话,我们是必须要知道当前删除节点的前置节点。所以这里思考几个问题。

是否需要虚拟节点

当然需要啦,之前一直强调的,链表的删除操作一定是需要虚拟节点做一些边界特殊处理。

如何找到需要删除的节点

  1. 遍历两遍,找到需要删除的节点,记下当前前置节点,伪代码:pre.next = pre.next.next。但是,请注意:本题是需要你只遍历一遍,所以这种方式不太适合。
  2. 双指针:我们看上图:需要删除倒数第二个节点:4,那必须的一个节点指向3,一个节点指向5,或者 5.next(大家思考下,这里如果是5或者5.next会对代码有什么影响)
删除倒数第几个节点节点1节点2节点1和节点2个距离(括号对应括号)
1node1->4node2->5(node2->5.next)1(2)
2node1->3node2->5(node2->5.next)2(3)
3node1->2node2->5(node2->4.next)3(4)
4node1->1node2->5(node2->3.next)4(5)

节点1:删除节点的前置节点(很重要)
节点2:while循环退出的条件:到底是最后一个节点退出、还是最后一个节点的下一个节点为null退出。两种while结束条件是不一样的。

动图展示

我们以 lastNode.next == null 作为结束条件举例。如果是 lastNode.next == null,那 node1和node2之间的距离是几呢
n+1 ,为什么是n+1,因为这样,slow移动才能指向到删除节点的上一个节点。看下图:
在这里插入图片描述
在这里插入图片描述
slow 和 fast同时移动,直到fast == null在这里插入图片描述删除slow指向的下一个节点,如图:在这里插入图片描述

代码

代码我一共给出三份,每份我都执行成功过,大家看的时候时候,一定要熟悉每个变量的意义,比如什么时候n+1,什么时候n。比如while(fast ==null) 还是while(fast.next == null ),这些都不是固定,哪种都可以,但是需要跟你自己定义的变量相对应。

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd2(ListNode head, int n) {ListNode dummy = new ListNode(-1, head);ListNode fast = dummy;ListNode slow = dummy;while (n > 0) {fast = fast.next;n--;}while (fast.next != null) {slow = slow.next;fast = fast.next;}slow.next = slow.next.next;return dummy.next;}public ListNode removeNthFromEnd3(ListNode head, int n) {ListNode dummy = new ListNode(-1, head);ListNode fast = dummy;ListNode slow = dummy;//注意这里:我是从虚拟节点开始的,所以需要N+1while (n >= 0) {fast = fast.next;n--;}//注意这里:是fast。不是fast.nextwhile (fast != null) {slow = slow.next;fast = fast.next;}slow.next = slow.next.next;return dummy.next;}public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(-1, head);//注意,这里本身已经走了第一步,所以下面n>0ListNode fast = dummy.next;ListNode slow = dummy;while (n > 0) {fast = fast.next;n--;}//注意这里是fast而不是fast.nextwhile (fast != null) {slow = slow.next;fast = fast.next;}slow.next = slow.next.next;return dummy.next;}

总结

  1. 双指针在解决这种只允许遍历一遍的问题上有很好的效果。
  2. 熟悉每个变量的意义

附:
以上图都来自于代码随想录

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

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

相关文章

社科院与杜兰大学金融管理硕士——跑赢过去的自己,用热情与毅力点燃生活的火焰

在这场人生的马拉松中,我们每个人都是跑者,背负着梦想与希望,不断挑战自我,超越过去的自己。我们追求的不仅仅是速度,更是那份持之以恒的毅力与智慧。而社科院与杜兰大学金融管理硕士项目,正是为那些渴望在…

鸿蒙新手入门-环境准备问题解析

Node.js版本与API配套关系 由于SDK的部分工具依赖Node.js运行时,推荐使用配套API版本的Node.js,保证工程的兼容性。 匹配关系见下表: API LevelNode.js支持范围API Level≤914.x(≥14.19.1)、16.xAPI Level>914.…

【MySQL进阶之路】MySQL中的聚簇索引和非聚簇索引、以及回表查询

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

电脑屏幕录制工具 Top10 榜单,免费无水印方法集

随着媒体行业的突飞猛进,不同服务之间对有效屏幕录制的竞争日益激烈。这导致市场上出现了质量参差不齐的屏幕录像机。特别是有些录屏器会自动给你录制的视频加上水印,给需要在公共场合使用的人留下不专业的印象。除此之外,它们甚至不能保护您…

innoDB page页结构详解

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。 Page分为几种类型,常见的页类型有数据页(B+tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等 Page 各…

网络防御保护——防火墙综合实验

一.实验拓扑 二.实验要求 1.办公区设备可以通过电信和移动两条链路上网(多对多的nat,并且需要保留一个公网ip不能用来转换)。 2.分公司设备可以通过移动链路和电信链路访问到dmz区域的http服务器。 3.分公司内部客户端可以通过公网地址访问到内部服务器。 4.FW1和FW…

快排——OJ题

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、颜色划分1、题目讲解2、算法原理3、代码实现 二、排序数组1、题目讲解2、算法原理3、代码…

openAI的视频技术Sora背后:奥特曼清单法

hello家人们...本人熟悉PS、Xd、Ai、Sketch、Figma、墨刀、即时设计、mastergo、Pixso等行业设计软件以及前端开发等技能,拥有10年的UI经验,我们可以通过关注评论私信交流以帮助到您解决UI工作中的烦恼!谢谢 OpenAI的视频技术Sora背后&#x…

ArkUI中自定义组件的生命周期

文章概叙 本文主要是介绍下在作为page以及component的时候的生命周期,以及调用API等应该在哪个生命周期使用。 书接上回 之前的博客已经结束了对底部栏的操作,现在开始需要关注到具体内容的对接了。 而开发的第一步,我们对页面的生命周期…

见智未来:数据可视化引领智慧城市之潮

在数字时代的浪潮中,数据可视化崭露头角,为打造智慧城市注入了强大的活力。不再被深奥的数据所束缚,我们通过数据可视化这一工具,可以更加接近智慧城市的未来。下面我就以可视化从业者的角度来简单聊聊这个话题。 数据可视化首先为…

GET与 POST

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) GET 和 POST 有什么区别? 根据 REC 规范,GET的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET请求的参数位置一般是写在 URL 中,UR…

OpenAI Sora视频生成机制:时空补丁

AI如何将静态图像转化为动态、逼真的视频?OpenAI 的 Sora 通过时空补丁(spacetime patches)的创新使用给出了答案。 独特的视频生成方法 在生成模型的世界中,我们看到了从 GAN 到自回归和扩散模型的许多方法,它们都有…