- 思路
如果要删除倒数第n个节点,让fast移动n步,然后让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)
{
//如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
ListNode* dumnyHead = new ListNode(0);//双指针法
dumnyHead->next = head;//虚拟头节点
ListNode* fast = dumnyHead;
ListNode* slow = dumnyHead;
while (fast != nullptr && n)//移动n步
{
fast = fast->next;
--n;
}
fast = fast->next;// fast再提前走一步(n + 1),因为需要让slow指向删除节点的上一个节点
while (fast != nullptr)//快慢指针同时后移
{
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dumnyHead->next;
}
};