删除链表的倒数第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+1
        while (n >= 0) {
            fast = fast.next;
            n--;
        }
        //注意这里:是fast。不是fast.next
        while (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>0
        ListNode fast = dummy.next;
        ListNode slow = dummy;
        while (n > 0) {
            fast = fast.next;
            n--;
        }
        //注意这里是fast而不是fast.next
        while (fast != null) {
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息安全认证 | CISP证书怎么样?值得考吗?

HCIE考证研究所的朋友们,新年快乐! 今天给大家说说CISP证书,新的一年祝大家逢考必过啊~ 01 考注册信息安全工程师证书的用处 CISP证书可作为学识和技能证明;求职、任职、晋升、加薪的资格凭证;用人单位招聘、录用劳动…

Python函数(一)

目录 一、定义函数 (一)向函数传递信息 (二)实参和形参 二、传递实参 (一)位置实参 (二)关键字实参 (三)默认值 (四)等效的函…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本:spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:世界上的另一个我 1:02━━━━━━️💟──────── 3:58 🔄 ◀️ ⏸ ▶️ ☰ &am…

VQ30 广告点击的高峰期(order by和limit的连用)

代码 select hour(click_time) as click_hour ,count(hour(click_time)) as click_cnt from user_ad_click_time group by click_hour order by click_cnt desc limit 1知识点 order by和limit的连用,取出所需结果 YEAR() 返回统计的年份 MONTH() 返回统计的月份 D…

渗透测试练习题解析 4(CTF web)

1、[GXYCTF2019]禁止套娃 1 考点:git 泄露 进入靶场后只有一串文字,源代码、抓包之类的都没有敏感信息出现,直接用 kali 的 dirsearch 扫描 发现存在 .git 目录,猜测应该是源码泄露,使用 GitHack 扒一下源码&#xff0…

什么是生产排产管理系统?哪个最好用?

阅读本文,你将了解:一、生产排产管理系统是什么;二、生产排产管理系统的功能;三、盘点五款好用的生产排产管理系统;四、生产排产管理系统的优势。 一、生产排产管理系统是什么 生产排产,也叫生产计划排程…

详解Sora,为什么是AGI的又一个里程碑时刻?

文|郝 鑫 编|王一粟、刘雨琦 2024年伊始,OpenAI再向世界扔了一枚AI炸弹——视频生成模型Sora。 一如一年前的ChatGPT,Sora被认为是AGI(通用人工智能)的又一个里程碑时刻。 “Sora意味着AGI实现将从1…

基于Doris构建亿级数据实时数据分析系统

背景 随着公司业务快速发展,对业务数据进行增长分析的需求越来越迫切,与此同时我们的业务数据量也在快速激增、每天的数据新增量大概在30w 左右,一年就会产生1 个亿的数据,显然基于传统MySQL数据库已经无法支撑满足以上需求 基于上…

Bonjour Print Services

Bonjour Print Services (apple mobile) https://download.csdn.net/download/spencer_tseng/88845785

SQL110 插入记录(一)(插入和interval关键字的用法)

代码 insert into exam_record(uid,exam_id,start_time,submit_time,score) values(1001,9001,2021-09-01 22:11:12,2021-09-01 22:11:12interval 50 minute,90), (1002,9002,2021-09-04 07:01:02,null,null)知识点 interval关键字的用法 INTERVAL关键字一般使用格式为&#x…

0206-1-网络层

第 4 章 网络层 网络层提供的两种服务 虚电路服务 数据报服务 概要: 虚电路服务与数据报服务的对比 网际协议 IP 网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议: 地址解析协议 ARP (Address Resolution Protocol)逆地…

【STM32】软件SPI读写W25Q64芯片

目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h main.c 测试 SPI通信(W25Q64芯片简介&am…

【数据结构与算法】递归、回溯、八皇后 一文打尽!

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

山西电力市场日前价格预测【2024-02-19】

日前价格预测 预测说明: 如上图所示,预测明日(2024-02-19)山西电力市场全天平均日前电价为377.52元/MWh。其中,最高日前电价为557.55元/MWh,预计出现在08:15。最低日前电价为247.93元/MWh,预计…

个人简历补充

个人简历补充 1.对工作的认识2.八股文和知识面3.框架/架构角度深扒3.1 前端3.1.1 mPaaS(移动领域)3.1.2 普通前端项目框架3.1.3 微前端 3.2 后端 持续更新 1.对工作的认识 2.八股文和知识面 前端(基础知识 / 开发能力 / 总结输出能力&#xf…

2.18总结

这两天在加强对最短路径的学习,除了Floyed比较简单之外,dijkstra、bell-mandford和SPFA学起来感觉有些难,洛谷上的模板题卡了半天都没写出来,最后只能通过看题解来帮助自己完成。 SPFA 算法实现: 最短路径算法对比比较…

嵌入式学习 C++ Day5、6

嵌入式学习 C Day5、6 一、思维导图 二、作业 1.以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…

驶向未来:3D可视化模型重塑我们的道路认知

在科技的浪潮中,每一个革新都是对人类未来生活的深度洞察。而今,当可视化这一技术走进我们的视野,它不仅是一场视觉盛宴,更是一次对未来出行方式的全新探索。 一、从平面到立体,解锁道路新视角 你是否曾站在十字路口&…

[Flink04] Flink部署实践

Flink部署支持三种模式:本地部署、Standalone部署、Flink on Yarn部署。 独立(Standalone)模式由Flink自身提供资源,无需其他框架,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但Flink 是大…