思路:
采用双指针的方法,使快指针先走n+1步,再让快慢指针一起走,最终快指针指向null的时候,慢指针指向要删除结点的前一个结点。
/**
* 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* visual_head = new ListNode();//开辟虚拟结点指向头结点
visual_head->next = head;//使虚拟结点指向头结点
ListNode* fast = visual_head;
ListNode* slow = visual_head;
n = n + 1;//循环n+1次,使快指针指向
while(n--)
{
fast = fast->next;
}
// fast = fast->next;
while(fast)//快慢指针一起移动,使得快指针指向为空时,慢指针指向要删除结点的上一个结点
{
// fast = fast->next;
slow = slow->next;
fast = fast->next;
}
ListNode* del = slow->next;
slow->next = del->next;
delete del;
return visual_head->next;//返回虚拟结点的下个结点,因为头结点可能被删除了
}
};