
这道题的思路比较简单,直接定义一个虚拟头节点,然后再定义快慢指针,快慢指针在初始状态下都指向虚拟头节点,然后让快指针先走n步,慢指针停在原地,然后快慢指针同步前进,当快指针fast
指向最后一个节点时,慢指针slow
指向待删除的节点的上一个节点,然后直接将待删除节点的后继节点(slow -> next -> next
)赋值给slow -> next
即可。下面用几个例子说明下这种方法的正确性。
cpp
/**
* 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* virtual_head = new ListNode();
virtual_head -> next = head;
ListNode* fast = virtual_head, * slow = virtual_head;
while(n--)
fast = fast -> next;
while(fast -> next){
slow = slow -> next;
fast = fast -> next;
}
slow -> next = slow -> next -> next;
return virtual_head -> next;
}
};