题目(leecode T19):
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
方法:双指针法
思路:定义两个指针同时指向虚拟的头节点,然后让快指针向后移动n+1个节点,随后两个指针同时向后移动,当快指针移动到链表结尾的NULL时,慢指针指向的就是要被删除节点的前一个位置,就比较方便后续的删除。
心路历程:要删除倒数第n个节点,先让快指针移动n位,相当于让快慢指针之间有了n个节点的距离差值,当快指针走到最后NULL时,慢指针与快指针之间的距离还是n,那么慢指针指向的自然就是倒数第n个节点。
题解:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while(n-- && fast != NULL){
fast = fast->next;
}
fast = fast->next; //fast要移动n+1位,使得slow在要删除节点的前一个
while(fast != NULL){
slow = slow->next;
fast = fast->next;
}
ListNode* temp = slow->next;
slow->next = temp->next;
delete temp;
return dummyHead->next;
}
};