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