力扣:19.删除倒数第n个节点
题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
思路:
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
具体思路:
fast最后指向空,fast先往前走一步,fast,slow就相隔1个单位,即当fast最后为空,slow就是倒数第一个。又因为要进行删除操作,slow指向的应该是要删除节点的前一个,所以fast要与slow相隔 n+1 个。
fast首先走n + 1步 ,fast和slow同时移动,直到fast指向 null,删除slow指向的下一个节点。
while(n--) 即循环体进行 n次
代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *slow = dummyHead;
ListNode *fast = dummyHead;
n++;
while(n-- && fast != nullptr){
fast = fast->next;
}
while(fast != nullptr){
fast = fast->next;
slow = slow->next;
}
fast = slow->next;
slow->next = slow->next->next;
delete fast;
fast = dummyHead->next;
delete dummyHead;
return fast;
}
};