LeetCode 19
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
难度:中等
前后指针,右节点先走 n 步,然后左右节点同时走。当右节点走到最后一个节点的时候,左节点就在删除节点的前一个节点。为了处理删除第一个节点的情况,设置 dummy 节点。
时间复杂度:O(m),其中 m 为链表的长度。
空间复杂度:O(1),仅用到若干额外变量。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode();
dummy->next = head;
ListNode* p0 = dummy;
ListNode* p1 = dummy;
for (int i = 0; i < n; i++) {
p1 = p1->next;
}
while (p1->next) {
p0 = p0->next;
p1 = p1->next;
}
ListNode* p2 = p0->next;
p0->next = p0->next->next;
delete(p2);
return dummy->next;
}
};