力扣 19. 删除链表的倒数第 N 个结点

【中等】力扣算法题解析LeetCode19:删除链表的倒数第N个结点 本文介绍了如何删除链表倒数第n个节点的算法。关键思路是使用双指针技巧,通过快指针先移动n步,再与慢指针同步移动,最终定位待删除节点的前驱。通过引入哑节点统一处理边界情况,算法在O(L)时间复杂度和O(1)空间复杂度内完成。Java实现中,快慢指针从哑节点出发,快指针先走n步后同步移动,当快指针到达末尾时,慢指针指向待删除节点的前驱,直接修改指针完成删除。该方法高效简洁,适合处理链表操作问题。 阅读详情

一、题目

在这里插入图片描述

二、题解

解法 1

链表给了头节点,可以通过遍历链表的方式进行删除。想要删除指定节点,只需要找到其前一个节点,并让前一个节点指向待删除节点的后一个节点即可。

解法 2

双指针
因为涉及到可能会删除头节点,因此设置一个 dummy node。先让 l 和 r 都指向 dummy node,让 r 先走 n 步指到第 n 个节点,这样 l 和 r 之间的距离保持了 n。然后,让 l 和 r 都同时往后移,l 和 r 一直保持着 n 的距离。当 r 指向最后一个节点时,即 r 指向倒数第一个节点,而 l 和 r 的距离为 n,即 l 指向第 n + 1 个节点,使得 l.next = l.next.next,即可实现删除倒数第 n 个节点。

三、代码

解法 1 代码

/**
 * 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 removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        int cnt = 0;
        ListNode cur = head;
        // 统计链表节点总个数
        while (cur != null) {
            cnt++;
            cur = cur.next;
        }
        // 寻找待删除节点的前一个节点
        ListNode pre = dummy;
        for (int i = 0; i < cnt - n; i++) {
            pre = pre.next;
        }
        // 删除
        pre.next = pre.next.next;
        return dummy.next;
    }
}

解法 2 代码

/**
 * 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 removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        ListNode l = dummy, r = dummy;
        // r 先走 n 步,使得 r 领先 l n 的距离
        for (int i = 0; i < n; i++) {
            r = r.next;
        }
        // l 和 r 同时走,直到 r 走到最后一个节点,此时 l 走到倒数 n + 1 个节点
        while (r.next != null) {
            l = l.next;
            r = r.next;
        }
        // 删除第 n 个节点
        l.next = l.next.next;
        return dummy.next;
    }
}

相关推荐

告别C盘爆红!手把手教你将WSL2下的Ubuntu 22.04完整迁移到D盘(附清理指南)

本文详细指导如何将WSL2下的Ubuntu 22.04从C盘无损迁移到D盘,包括导出备份、注销原系统、导入新位置等关键步骤,并提供迁移后的优化配置、开发环境衔接及长期维护技巧,帮助用户彻底解决C盘空间不足问题。

weixin_28698059的博客 472

19. 删除链表的倒数第 N 个结点(力扣LeetCode)

通过使用两个指针来实现的,一个快指针(fast)首先向前移动 n 步,然后快指针和慢指针(slow)一起移动直到快指针到达链表尾部。最后,函数删除了在开始时创建的哑节点(虚拟头节点),并返回链表的新头节点。然后,它通过第一次遍历计算出链表的长度,接着计算出要到达的节点,最后通过第二次遍历找到目标节点的前一个节点。通过修改指针,实现了目标节点的删除,并且在结束前释放了删除节点和哑节点占用的内存。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。

m0_73841621的博客 872

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash。

cl234583745的博客 1466

力扣(LeetCode)——19. 删除链表的倒数第 N 个结点

力扣(LeetCode)——19. 删除链表的倒数第 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] 提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1

壹的博客 475

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5907

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 273

(力扣)LeetCode19. 删除链表的倒数第 N 个结点(C++/C语言)

【墨染】快慢指针 or 朴素做法。一题双解。

墨染 428

手把手教你学Simulink——高频隔离型双向DC-AC逆变器的建模与仿真

本文系统讲解高频隔离型双向DC-AC逆变器的Simulink建模与仿真,基于DAB+全桥逆变两级拓扑,详述DAB移相控制原理、双闭环控制策略及分步仿真搭建流程。重点涵盖电路建模、控制环设计、参数设置与常见问题调试,强调模块化分步验证与分层控制逻辑,实现安全、高效、灵活的双向能量流动仿真,适用于储能、微电网等场景的系统开发与验证。

MHD0815的博客 106

19. 删除链表的倒数第 N 个结点【 力扣(LeetCode) 】

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?

yyh520025的博客 713

WPF vs Avalonia: 跨入C#桌面应用现代化的大门

请注意,这只是一个目录,详细内容将根据这个结构逐步展开。如果您需要某个特定部分的详细内容,请告知我,我将为您提供深入的解析和示例代码。WPF,全称Windows Presentation Foundation,是微软为Windows平台量身打造的UI框架。自2006年发布以来,它就像一位经验丰富的老船长,引领着桌面应用的航船在技术的海洋中乘风破浪。Avalonia,一个新兴的跨平台UI框架,它像一位年轻的探险家,勇敢地探索着桌面应用的新世界。

java专栏 2398

基于信号完整性的PCB设计原则

基于信号完整性的PCB设计建议,以单网络的信号布线作为评估对象,给出了一些最基础的设计指导,如何灵活运用,取决于设计者根据实际场景如何做取舍和判断。

一只豌豆象的博客 1758

leetcode 19. 删除链表的倒数第 N 个结点

先从头到尾遍历链表,得到链表的长度count,结点编号从1开始起算的话,第(count - n + 1)个结点就是要删除的结点。leetcode官方题解,给出的办法是再遍历一次,遍历到第count-n+1个结点就可以做删除操作了。我用的是用空间换时间,第一次遍历的时候用哈希表把所有结点的地址存起来,哈希键就是结点的序号,这样就不用第二次遍历链表,但同时增加了空间开销。题目说结点的数目是1到30个,所以哈希表ListNode* nodes[31]。

weixin_41554427的博客 708

OpenClaw实战系列·进阶特辑02:多智能体协同——打造企业级AI中台

**企业级AI中台面临多Agent协同的挑战,本文提出基于多智能体协同的解决方案。通过分析单Agent的局限性(上下文溢出、专业度稀释等)和多Agent的核心优势(任务专注度、故障隔离等),提出三种协作架构模式(指挥型、联邦型、点对点型),并强调人格化设计的重要性。文章详细介绍Agent间通讯机制(同步/异步会话、文件系统协作)和"身脑分离"的解耦架构设计,提供可落地的企业级AI中台实施方案。

PeterPan的博客 493

力扣LeetCode第19题删除链表的倒数第N个结点

力扣LeetCode第19题删除链表的倒数第N个结点

weixin_44061444的博客 369

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

leetcode力扣19. 删除链表的倒数第 N 个结点

第二个就是指在像本题这种新建链表的题目中,为了避免表头判空问题提前new一个表头,值任意,习惯用-1。两个技巧,一个是寻找单链表倒数第k个节点,二是虚拟链表头。简化了labuladong的算法。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。第一个技巧详细描述在。只用了38.41MB。

weixin_43467758的博客 384

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5输入:head = [1], n = 1输出:[]输入:head = [1,2], n = 1输出:[1]你能尝试使用一趟扫描实现吗?

Dubhehug的博客 362

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点

定义一个快指针和一个慢指针都先指向头结点,然后快指针先走n步,然后快、慢指针同时走,发现当快指针走到链表结尾的时候,慢指针就刚好走到了要删除结点的前一个结点,那么此时只需要将慢指针的next指向慢指针next的next即可完成删除操作(就本题来说可以忽略释放删除结点这个操作,当然释放一下也可以)

samroom的博客 866

双指针解leetCode19题“删除链表的倒数第 N 个结点”有感

双指针解leetCode19题“删除链表的倒数第 N 个结点”有感!列举了我做这道题的一些困惑,不知道大家有没有类似的感受。

Zlwjiayou的博客 1763

day18【LeetCode力扣】19.删除链表的倒数第N个结点

fast先走n+1步,这样同时移动的时候slow指向删除节点的上一个节点。看完题述后,链表只能从前往后查找,根据这个特点,想到使用。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

canGfly的博客 647

链表之leetcode19:删除链表的倒数第N个结点

使用快慢指针删除链表的倒数第N个结点

weixin_44885503的博客 285

【c++】leetcode19 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 解法:快慢指针,快指针先走n步,第n+1步慢指针才开始走。等到快指针走到链表尾的时候,就走到需要被替换链表节点的前一位。然后通过->next = ->next->next。

聿默的博客 197

力扣刷题19. 删除链表的倒数第 N 个结点

题目描述:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。

qq_51015052的博客 556

golang力扣leetcode 19.删除链表的倒数第N个结点

19.删除链表的倒数第N个结点19.删除链表的倒数第N个结点题解代码 19.删除链表的倒数第N个结点 19.删除链表的倒数第N个结点 题解 思路: 1.计算链表长度 1.计算链表长度 2.增加一个哑节点,遍历到倒数n+1的位置 2.栈存储节点 1.存储所有节点 2.倒数n+1的节点就是nodes[len(nodes)-1-n] 3.双指针 1.两个指针,步伐相同 2.快指针先移动n步 3.两个指针一起移动,直到快指针为nil 4.此时慢指针就是倒数n位置 代码 func removeNthFromEn

清风 834

精选力扣500题 第53题 LeetCode 19. 删除链表的倒数第 N 个结点【c++/java详细题解】

目录1、题目2、思路3、c++代码4、java代码 1、题目 给你一个链表,删除链表的倒数第 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] 提示: 链表中结点的数目为sz 1 <= sz <= 30 0 <

林深不见鹿 的博客 2700

leetcode力扣 19 删除链表的倒数第N个结点

首先开辟空间给dummy变量,以防头节点被删,使它插入到头节点前,并将值置为0.遍历完成后使遍历得最后一个结点next指向被删除的next,使头节点指向下一指针,返回长度值;计算出链表长度,遍历删除结点前的结点,使一一连接。定义删除结点函数,将头节点和N值传入。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

CKROL的博客 136

题解 力扣 LeetCode 19 删除链表的倒数第N个结点 C/C++

用指针数组记录链表各个节点的地址,遍历一遍就解决问题 指针数组用 NULL 初始化 遍历同时达成两个目的:1.获取链表大小 2.记录链表各节点地址 遍历完令所删除节点的上一个节点指向所删除节点的下一个节点即可 注意特判 n 为 count 的情况 最近写过不止一道链表与数组结合的题 通常单向不循环链表只能顺着->next一个一个访问过去 但是与数组结合后可以赋予链表一部分顺序表的特点,通过下标就能访问了,这样会简单特别多

qwq_ovo_pwp的博客 488
上一篇: 力扣 237. 删除链表中的节点【狸猫换太子】
下一篇: 力扣 142.环形链表Ⅱ【详细解释】
JZihui
博客等级 码龄6年 170粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值