Leetcode19(亚马逊真题):删除链表的倒是第N个节点
题目分析
-
删除节点关键:找到被删节点的前一个节点,指针指向
-
虚拟头节点,方便删除头结点,形成统一操作
-
为啥要让快指针先行?
我认为更好懂的一种解释:快指针先行n步,这样快慢指针之间形成了一段长度为n的窗口,之后快慢指针同步向前相当于保持窗口长度不变。这样当快指针到达了末尾指向NULL,另一端的慢指针距离末尾的长度是n,自然就是指向倒数第n个位置了。
-
为啥快指针先行了n+1步?
由于单链表中的next指针指向的是下一个节点,想要删除倒数第n个节点,自然要将操作指针慢指针指向倒数第n+1个节点,这样才能进行删除操作。
-
虚拟头节点dummyHead的作用是?
如果单链表中要删除的节点是头节点,这个头节点正好是dummyHead的下一个节点,如此即可统一起来删除操作而不必单独考虑。
-
额外注意?
如果使用C++,最后记得释放删除的节点以及dummyHead
代码实现
易错点我也卸载注解里面了,记得应该 new 创建节点对象
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {// ListNode* dummyHead; 这只是定义内存,并么有初始化,ListNode* dummyHead = new ListNode(0); //应该通过new 创建节点对象//虚拟头结点指向头结点的pre,为了删除头结点dummyHead->next = head;ListNode* fast = dummyHead;ListNode* slow = dummyHead;//快指针先走n+1步,形成n+1窗口大小for(int i=1; i<=n+1; i++){fast = fast->next;}//慢指针开始走,和fast同步走,永远必fast小n+1窗口大小,//那么当fast走到null末尾时,slow指针就是倒数第n+1个节点了while(fast != nullptr){fast = fast->next;slow = slow->next;}//此时slow指向倒数n节点的前一个节点,//即倒数N+1节点。然后通过slow删除slow->next = slow->next->next;return dummyHead->next;}
};