当前位置: 首页 > news >正文

算法初学者解决删除链表倒数的节点(力扣19题)(双指针)

1,📚题目介绍

在开始之前请理解下图1

(仅仅在本题的话,链表节点的值不重要,所以我的图省去了值)

题目要求,删除倒数第n个节点。

同时链表至少有一个节点

n在链表节点数之内

2,💡采用方法

这里我采用的是双指针法,至于为什么我也解释不清,先用就行了。

3,🤔具体逻辑

所谓快慢指针,肯定要一个快指针和慢指针了。

定义在哪里呢?先在head节点定义这两位吧。

然后!请集中注意力,争取看一遍就理解.

想删除倒数第一个节点,就必须要找到倒数第二个节点。

想删除倒数第二个节点,就必须要找到倒数第三个节点。

(这是链表删除的知识,如果不懂建议了解一下链表删除操作)

请记住点①:想删除倒数第n个节点,就要找到倒数第n+1个节点。

(你可能想到了极限情况,链表只有一个节点,但先忽略,后面再提)

然后,是让人头疼的问题,单向链表,如何找到最后一个节点?

这不简单吗!循环一下不就行了?这样确实可以,而题目鼓励我们用一次循环就搞定,这里我就用第一次循环的思路。

想找到最后一个节点,最容易想到的方法就是遍历,那就这样做,但是呢,找到最后一个节点的同时顺便把倒数第n+1个节点找到,这样就能删了。

请记住点②:快指针找最后一个节点,慢指针找倒数第n+1个节点

(依据点①,找到倒数第n+1个就可以删除第n个节点)

这时候,你就会神奇的发现,快慢指针的距离,神奇的差了n个节点!

如下图,想删除倒数第2个节点,就让slow与fast差了两个节点,也就是让快指针提前慢指针走2步!

请记住点③:快指针需要提前慢指针n步

综上,想要删除第n个节点就要让先快指针领先慢指针n个节点!

这样似乎就可以写出代码了

  1. 定义快慢指针于head

  2. 让快指针提前走n步

  3. 快慢一起遍历,直到快指针找到了最后一个节点(此时,慢指针就找到了倒数n+1个节点,就能删除倒数第n个节点了!这是题目要求的啊,不要忘记题目的要求)

  4. 删除第n个节点

  5. 返回头结点

但是这样写的话,就会发现是通过不了的。

肯定是遗漏了什么东西,没错,就是极限情况:删除的是链表的头结点,此时模拟一下

按照之前的思路,要删除倒数第n个节点,就要让fast指针领先slow指针一步,由于slow本身就在头结点上,根本找不到头结点前面的节点,这怎么删除呢?

这时候,就要引入传说中的虚拟头结点(dummy head)了,也不要被吓到,这就是一个新的节点,你到时候new ListNode一下就行了,只是他的名字叫虚拟头结点

这个虚拟头结点的一个好处就是方便这种头结点的处理

处理如下图

现在你再看看呢?fast领先慢指针1步,这时fast指针不就是最后一个头结点吗?slow指针不就是倒数第n+1(这个例子中n=1也就是1+1=2)个节点吗?

找到倒数第n+1个(倒数第2个)也就是能正确删除倒数第n(倒数第1个)个节点了。

这就是引入虚拟头结点的好处。

4,⚛️题解

这样本题两个问题,一个主题逻辑和一个极限情况的坑就解决了。

写出如下代码(java):

class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { //定义虚拟头结点用于解决链表只有一个节点的情况 ListNode dummyHead=new ListNode(); //保存头节点 dummyHead.next=head; //在dummyhead上定义快慢指针 ListNode fast=dummyHead; ListNode slow=dummyHead; //让快指针领先n步 while(n-->0){ fast=fast.next; } //一起移动,找到最后的节点 while(fast.next!=null){ fast=fast.next; slow=slow.next; } //删除操作 slow.next=slow.next.next; //返回题目要求的头结点 return dummyHead.next; } }

5,🍃尾声

希望本篇能帮到你,本人也是算法初学者,如果有错误请在评论区指出,谢谢!

可以给个赞吗,这会让博主高兴一整天

http://www.jsqmd.com/news/1141559/

相关文章:

  • 京东云Coding Plan Lite与Pro版深度对比:开发者如何按需选择构建环境
  • LTC6903与PIC24EP构建高精度数字控制振荡器方案
  • STM32与MAX9744构建高效D类音频放大系统
  • AltDrag完整指南:如何用Alt键彻底改变你的Windows窗口操作体验
  • B站视频下载神器:三步解锁大会员4K与充电专属内容
  • STM32与MP8859实现智能电源管理方案
  • 企业微信会话存档技术选型:自研 vs 第三方服务商的 TCO 深度分析
  • STM32与LARA-R6401 LTE模块的硬件协同设计与优化
  • Web安全三大漏洞CRLF、CSRF、SSRF:从原理到实战防御指南
  • Krea 2图像生成模型:从基础原理到API部署与本地自托管实践
  • Rufus 4.1 全界面参数完整详解
  • ADS122U04与PIC18LF46K40高精度信号采集方案
  • M-LOAM 与 LOAM/LIO-SAM 对比:3 种激光SLAM方案在4类场景下的精度与鲁棒性分析
  • 3步解锁网易云音乐NCM格式:告别设备限制的音乐自由之旅
  • STM32与TB9051FTG实现低噪声直流电机控制方案
  • pycharm2023.2.5分享
  • STM32F746ZG与171010550的DC-DC降压电源设计实战
  • 撕下 MyBatis 的行业遮羞布:一款违背框架第一性原理的逆向设计产物
  • 泊松积分与伽马函数:3个核心公式在概率论与物理建模中的实战应用
  • LoRA论文关键实验复现:低秩适配究竟在哪些任务上真正有效
  • 腾讯云 EdgeOne 免费版 CDN 套餐,亲测可领多个!
  • GWAS数据整合的终极指南:如何用gwasglue快速连接基因组分析工具
  • 缠论量化分析新革命:5分钟掌握通达信自动画线插件
  • MAX9744 D类音频放大器与PIC18F86J10的高效音频系统设计
  • LARA-R6401 LTE模块与PIC18F4682微控制器的接口设计与优化
  • 基于DRV8213的智能散热系统设计与PID控制实现
  • SpringBoot3 + Vue3 + 微信小程序如何学习,以及学哪些技术,组件
  • 2026图片去水印工具教程:手机电脑软件、在线网站AI效果对比
  • Java毕设选题推荐:基于 SpringBoot 的露营场地状态管理系统的设计与实现 休闲露营活动发布与报名管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • OBS实时字幕插件终极指南:5分钟为直播添加专业字幕