双指针(或称为快慢指针)方法是一种在链表、数组等数据结构中经常使用的技术。它的核心思想是利用两个指针以不同的速度遍历数据结构,从而快速定位到需要操作的位置。在删除链表的倒数第n个节点这个问题中,双指针方法特别有效。
双指针方法详解
1. 引入哑节点(Dummy Node)
为了处理头节点被删除的情况,我们通常在链表头部添加一个哑节点(Dummy Node)。哑节点不存储任何数据,只是它的next
指针指向链表的头节点。这样,无论我们要删除的是头节点还是其他节点,我们都可以统一处理。
2. 初始化快慢指针
我们定义两个指针,一个快指针(fast)和一个慢指针(slow),都初始化为哑节点。
3. 快指针先走n步
我们让快指针先向前走n步,这样快指针和慢指针之间就拉开了n个节点的距离。此时,快指针和慢指针之间的距离(包括快指针指向的节点和慢指针指向的节点)就是n+1。
4. 快慢指针同时移动
接着,我们让快慢指针同时向前移动。由于快指针比慢指针先走了n步,所以当快指针到达链表末尾(即fast.next
为None
)时,慢指针slow
就指向了倒数第n+1个节点。此时,慢指针的next
指针指向的就是要删除的倒数第n个节点。
5. 删除倒数第n个节点
由于我们已经找到了要删除的节点的前一个节点(即慢指针指向的节点),所以我们只需要将慢指针的next
指针指向下下个节点(即slow.next.next
),就可以删除倒数第n个节点了。
6. 返回结果
因为我们使用了哑节点,所以最终返回的是哑节点的next
指针,也就是修改后的链表的头节点。
示例
以输入head = [1,2,3,4,5], n = 2
为例:
- 初始状态(引入哑节点):
0 -> 1 -> 2 -> 3 -> 4 -> 5
- 快指针先走2步:
fast
指向2
,slow
指向0
- 快慢指针同时移动:当
fast
到达末尾5
时,slow
指向3
- 删除倒数第2个节点(即
4
):将slow.next
指向5
- 返回结果:返回哑节点的
next
,即1 -> 2 -> 3 -> 5
总结
双指针方法通过控制两个指针的移动速度,可以方便地定位到链表中的特定位置,从而实现对链表的快速操作。在删除链表的倒数第n个节点这个问题中,双指针方法提供了一种简洁、高效的解决方案。