🧩Algo 链表
19. 删除链表的倒数第 N 个结点
难度:🟡 Medium | 标签:链表、双指针 | 状态:⬜ LeetCode 链接
思路
快慢指针 + dummy。快指针先走 n+1 步,然后两个一起走到 fast == nullptr,slow 正好指向要删节点的前驱。
dummy 让删头节点这种 corner case 无需特判。
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode dummy(0, head);
ListNode *fast = &dummy, *slow = &dummy;
for (int i = 0; i <= n; ++i) fast = fast->next;
while (fast) { fast = fast->next; slow = slow->next; }
auto* del = slow->next;
slow->next = del->next;
delete del;
return dummy.next;
}
};
复杂度
- 时间 O(n),空间 O(1)
易错 / 回顾
- 快指针先走
n+1而不是 n(这样 slow 落在前驱) - dummy 让删头节点 case 自然处理
- 释放被删节点(如果题目用 new)
Related · 链表