给你一个链表,删除链表的倒数第n个节点,并且返回链表的头节点。
思路:双指针
这是个双指针的典型应用。让fast移动n+1步,然后让fast和slow同时移动,直到fast指向链表末尾(而不是处于链表末尾!)。删掉slow所指向的节点就可以了。
- 定义fast指针和slow指针,初始值为虚拟头节点
- - fast首先走n + 1步!为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:
- fast和slow同时移动,直到fast指向末尾
- 删除slow指向的下一个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};