本文参考代码随想录
删除链表倒数第N个节点,并返回头结点
思路:双指针法。用fast移动n歩,然后fast和slow同时移动,直到fast指向末尾,删除slow指向的节点即可。推荐使用虚拟头结点
- 定义fast和slow,初始值为虚拟头结点
- 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* slow = dummyHead;
ListNode* fast = dummyHead;
while(n-- && fast != nullptr){
fast = fast->next;
}
fast = fast->next;//再走一步
while(fast != nullptr){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
时间复杂度、空间复杂度均为O(1)