删除链表的倒数第 N 个节点

1、参考资料

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

2、题目要求

题目描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.

进阶:

你能尝试使用一趟扫描实现吗?

3、代码思路

这道题的思路和寻找链表倒数第 N 个节点的思路相似,使用双指针可以通过一趟遍历完成

  1. 不同的是寻找链表倒数第 N 个节点需要定位至倒数第 K 个节点,而单链表的删除需要定位至待删除节点的前一个节点,即倒数第 N+1 个节点
  2. 那么问题就来了,我如果想要删除链表的首节点怎么办?首节点可是没有前一个节点的呀,这时候头结点(dummyHead)就派上用场了,我们在原链表的基础上定义一个头结点 dummyHeaddummyHead 指向原链表的首节点(head)
  3. 我们定义两个指针:front 指向链表前部,behind 指向链表后部,我们目标是当 behind 指向 null 的时候,front 指向倒数第 N+1 个节点,此时通过 front.next =f ront.next.next 即可删除倒数第 N 个节点

边界条件的确定

  1. 因为我们需要定位至倒数第 N+1 个节点,所以 frontbehind 始终相差 N+1 个节点

  2. 就拿下面的例子来说明,链表为 1 --> 2 --> 3 --> 4 --> 5,我们需要删除倒数第 2 个节点

    1 --> 2 --> 3 --> 4 --> 5 --> null
    
  3. 首先我们在链表前面加一个 dummyHead,让 front 指向 dummyHead,让 behind 指向 head

    dummyHead --> 1 --> 2 --> 3 --> 4 --> 5 --> null^         ^|         |front    behind
    
  4. behind 向后移动两步,即初始化时 behind 指向 head,然后向后移动 N

    dummyHead --> 1 --> 2 --> 3 --> 4 --> 5 --> null^                     ^|                     |front                behind
    
  5. frontbehind 一起向后移动,直至 behind 为空

    dummyHead --> 1 --> 2 --> 3 --> 4 --> 5 --> null^                  ^|                  |front              behind
    
  6. front.next =f ront.next.next 删除倒数第 2 个节点

    dummyHead --> 1 --> 2 --> 3 --> 5 --> null^            ^|            |front        behind
    

4、代码实现

代码

static class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {// DummyHeadListNode dummyHead = new ListNode(0);dummyHead.next = head;ListNode front = dummyHead; // 初始化时 front 指向 dummyHeadListNode behind = head; // 初始化时 front 指向 head// behind 向后移动 n 步,保证 front 和 behind 相差 n+1 步int count = 0;for (; count < n && behind != null; count++) {behind = behind.next;}// 如果输入的 n 大于链表长度,则直接返回原链表if (count < n) {return head;}// front 和 bbehind 一起后移while (behind != null) {behind = behind.next;front = front.next;}// 删除倒数第 n 个节点front.next = front.next.next;// 返回新链表的首节点return dummyHead.next;}
}static class ListNode {int val;ListNode next;ListNode(int x) {val = x;}
}

删除链表的倒数第 N 个节点相关推荐

  1. 刻意练习:LeetCode实战 -- Task11. 删除链表的倒数第N个节点

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  2. 19. 删除链表的倒数第N个节点

    题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表 ...

  3. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  4. python 删除链表中倒数第N个节点

    | 删除链表中倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入: ...

  5. LeetCode第19题;删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删 ...

  6. LeetCode19删除链表的倒数第N个节点20有效的括号

    维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡. 19删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1-> ...

  7. 删除链表的倒数第N个节点—leetcode19

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  8. java 链表删除头结点,删除链表的倒数第N个节点,并返回链表的头节点

    面试的时候遇到了一个笔试题,是leetcode的原题,原题的连接: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ ...

  9. LeetCode-19 删除链表的倒数第N个节点

    文章目录 题目描述 我的解法 反思 优化 再次反思 再次优化 总结 Github 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...

  10. 2019-03-18-算法-进化(删除链表的倒数第N个节点)

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1 ...

最新文章

  1. 软件架构自学笔记——非功能特性
  2. 9.5. SELINUX
  3. SAP BW数据源增强管理
  4. python 底层原理_Python字典的核心底层原理讲解
  5. 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了
  6. MySQL中函数CONCAT及GROUP_CONCAT 对应oracle中的wm_concat
  7. oracle数据库定时同步工具,[每天自动同步一个数据库表的数据]sql server定时同步oracle数据表...
  8. 【MyBatis框架】MyBatis入门程序第二部分
  9. 机器学习技法2-Dual Support Vector Machine
  10. Zoom视频会议软件
  11. linux打开txt文件命令_Linux文件操作,这些命令可以搞定
  12. Facebook上市或造千亿美元航母
  13. 广州白云国际机场IT信息化历程及信息化系统介绍
  14. 【运筹帷幄】网站打开慢故障排查思路
  15. 动态功能连接:前景、问题和解释
  16. Camera | 4.瑞芯微平台MIPI摄像头应用程序编写
  17. mybatis学习日志之总结
  18. 时钟MUX电路结构的时序约束方法分析
  19. 写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
  20. 3D游戏建模布线方法

热门文章

  1. 电影屏幕行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  2. 用计算机弹猪猪侠数字,猪猪侠之挑战数字
  3. IntelliJ IDEA 2018 破解 汉化教程地址
  4. kaggle比赛语言java_Kaggle调查:2018年数据科学家最常用(和最推荐)的编程语言榜单...
  5. 超400万用户的Chrome截图插件下架始末
  6. 曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...
  7. 当跨国企业女职业经理人遇上创业女 CEO,两者会擦出什么样的火花?
  8. 蚂蚁回应渠道之争;微软更新致大规模服务中断;OpenSSH 8.4 发布|极客头条
  9. 新常态 新核心,浪潮商用机器为关键行业数字化转型打造新Power
  10. 中国数据库产业的“高地战事”