思路
双指针法,快指针用于与慢指针拉开距离,慢指针用于删除元素,越过慢指针后面的元素。
具体删除时,需要添加虚拟头结点,原因是如果倒数第N个结点是头结点的话,slow指向的就是头结点,没有办法用slow->next = slow->next->Next删除
需要添加虚拟头结点,因此fast向后移动n+1个位置
再同时移动fast与slow,直到fast移动到最后,用slow删除元素
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
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!=0)
{
fast = fast->next;
n--;
}
fast = fast->next;
while(fast!= nullptr)
{
fast = fast->next;
slow = slow->next;
}
ListNode *deletenode = slow->next;
slow->next = slow->next->next;
delete deletenode;
return dummyHead->next;
}
};