链表题目讲解 —— 删除链表的倒数第 n 个节点(LeetCode 19)

在面试中,链表相关题目非常常见,今天我们来分析一道高频面试题:Remove Nth Node From End of List

题目描述

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

举例说明

  • 输入head = [1,2,3,4,5], n = 2
  • 输出[1,2,3,5]

  • 输入head = [1], n = 1
  • 输出[]

  • 输入head = [1,2], n = 1
  • 输出[1]

约束

  • 链表节点总数 sz 满足 1 <= sz <= 30
  • 每个节点的值 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶:只遍历一次链表能否解决?


解法一:数组辅助法(O(n) 空间)

最直接的思路是:

  1. 在遍历链表时,用一个数组记录每个节点的编号和指针。
  2. 遍历完成后,根据数组索引定位到倒数第 n 个节点,访问其前驱和后继指针,断开连接即可。
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

这种方法实现简单,但需要辅助空间,面试官可能会追问有没有更优化的解法。


解法二:双指针法 + 虚拟头结点 dummy(O(1) 空间,O(n) 时间)

双指针法能够只遍历一次链表:

  1. 设置 ab 两个指针,它们初始都从链表的头节点出发。首先让 b 先向后移动 n 步(或 dummy 节点后移动 n+1 步)。
  2. 之后 ab 同步向后移动,直到 b 指向链表结尾(b->next == null)。
  3. 此时,a 指向要删除节点的前驱节点,直接修改 a->next 指针即可断开目标节点。
  4. 返回 dummy->next 作为新链表头。

使用 dummy 节点的好处

  • dummynext 指向 head
  • 所有删除操作和边界情况(删除头节点)都变得一致,无需特殊处理。

小结

  • 数组法空间复杂度高,但思路简单。
  • 双指针 + dummy 节点,不仅实现更优,还能应对所有删除情况。
  • 推荐面试中使用双指针和 dummy 节点的通用写法,提高代码健壮性。

如果你有链表相关更多问题,或想要代码实现,可以留言交流!


参考链接

相关推荐
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
To_OC5 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC5 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC6 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC6 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC7 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
To_OC9 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC10 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode