题目链接:19.删除链表的倒数第N个节点
卡哥的视频讲解:链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点
题目思路:要找到删除的节点,就要知道它的上一个节点是什么,我开始的想法是把链表反转过来,直接删除第n个节点,但是这个操作就复杂了,可以直接使用快慢指针。假如要删除倒数第n个节点,则让快指针先走n+1步(+1是为了让慢指针指向被删除节点的前一个),再让快慢指针同时走,当快指针指向空时,慢指针就走到被删除节点的前一个了。(如下图)
分为以下几个步骤:
代码示例:
代码逻辑:
-
在
delete
方法中,创建了一个虚拟头节点dummyhead
,其值为 -1,目的是方便后续操作。然后将虚拟头节点的next
指针指向链表的头节点head
,这样可以确保链表不会因为删除节点而丢失头节点。 -
定义了两个指针
fast
和slow
,它们都指向虚拟头节点dummyhead
。其中fast
指针先向后移动 n+1 步,这样fast
和slow
之间相差 n 个节点。 -
使用
while
循环遍历链表,当fast
指针到达链表尾部时,slow
指针正好指向倒数第 n+1 个节点。 -
根据题目要求,需要删除倒数第 n 个节点。因此将
slow
指针的下一个节点指针指向下下个节点,即删除了倒数第 n 个节点。 -
最后,返回虚拟头节点的下一个节点,即链表的头节点,完成了删除操作。
总结:
一定是要让快指针走n+1步而不是n步,不然就无法让慢指针指向被删除节点的前一个了。