[路飞]_leetcode-19-删除链表的倒数第 N 个结点

简介: leetcode-19-删除链表的倒数第 N 个结点

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


给你一个链表,删除链表的倒数第 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 <= n <= sz


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


本题并不难,只是在查找倒数第 n 个节点的基础上加了一个删除操作 解题思路如下:


  1. 根据题意可得,如果链表只有一个节点,那么此时 n 必然等于 1,那么删除倒数第一个节点之后的链表为空,所以特判如果链表只有一个节点,直接返回 null 即可
  2. 创建虚拟头节点,因为本题删除的节点有可能是头节点,所以创建虚拟头节点可以方便我们的操作,简化处理逻辑
  3. 定义三个指针 pre 指向虚拟头,targetnext 指向 head
  4. next 指针向后走 n
  5. pretargetnext 一起向后走,直到 next 指向 null,此时 target 指向倒数第 n 个节点
  6. pre 指针指向元素(也就是 target 前一个元素)的 next 指针指向 target.next 来达到从链表中删除 target 节点的目的
  7. 返回虚拟头节点的下一个节点即可


整体过程如下:


网络异常,图片无法展示
|


代码如下:


var removeNthFromEnd = function(head, n) {
  // 特判 如果链表只有一个节点,则 n 必然为1,此时删除倒数第一个节点后链表为空
  if(head.next === null) return null;
  // 创建虚拟头节点
  const vhead = new ListNode(0);
  vhead.next = head;
  // 定义三个指针
  let pre = vhead,
  target = head,
  next = head;
  // next向后走n步
  while(n){
    n--;
    next = next.next;
  }
  // 当next不为空的时候,三个指针一起向后走
  while(next){
    pre = pre.next;
    target = target.next;
    next = next.next;
  }
  // 此时target指向的就是倒数第n个节点
  // 通过将pre.next指向target.next的方法从链表中删除target
  pre.next = target.next;
  return vhead.next;
};
复制代码


至此我们就完成了 leetcode-19-删除链表的倒数第 N 个结点


如有任何问题或建议,欢迎留言讨论!

相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
137 1
|
4月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
218 1
|
6月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
204 10
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
141 0
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
247 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
147 2
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
178 1