【算法--链表题2】19.删除链表的倒数第 N 个节点:通俗详解
一、题目是啥?一句话说清
给你一个链表,要求删除从末尾数起的第N个节点,并返回修改后的链表头。
示例:
- 输入:
[1,2,3,4,5]
, n = 2 - 输出:
[1,2,3,5]
(删除了倒数第2个节点,即值为4的节点)
二、解题核心
使用双指针技巧:让一个指针先走N步,然后两个指针一起移动,当先走的指针到达末尾时,后面的指针正好指向要删除节点的前一个位置。
这种方法只需遍历链表一次,是最高效的解决方案。
三、关键在哪里?(3个核心点)
1. 双指针/快慢指针技巧
- 是什么:使用两个指针,一个"快"指针先移动N步,然后"慢"指针和快指针一起移动。
- 为什么:当快指针到达链表末尾时,慢指针正好指向倒数第N个节点的前一个节点,这样就能直接进行删除操作。
2. 虚拟头节点(Dummy Node)
- 是什么:在原始链表前添加一个不存储实际数据的节点。
- 为什么:可以统一处理各种边界情况,特别是当需要删除的是头节点时,使用虚拟头节点可以避免特殊处理。
3. 指针移动的步数控制
- 是什么:精确控制快指针先走的步数,以及双指针同时移动的时机。
- 为什么:步数计算错误会导致指针定位不准确,无法正确找到要删除的节点。
四、看图理解流程(通俗理解版本)
想象两个人在一条链子上走路,一个人(快指针)先出发,走了N步后,另一个人(慢指针)也开始走。当先走的人到达链子尽头时,后走的人正好站在要删除的节点的前一个位置。
具体步骤(以删除倒数第2个节点为例):
-
初始状态:
- 创建虚拟头节点,指向真实头节点
- 快慢指针都指向虚拟头节点
- 链表:dummy → 1 → 2 → 3 → 4 → 5 → NULL
-
快指针先走N步:
- 快指针先走2步,指向节点2
- 慢指针仍在dummy
- 状态:慢@dummy, 快@2