力扣-19. 删除链表的倒数第N个节点(Remove Nth Node From End of List)

力扣-19. 删除链表的倒数第N个节点(Remove Nth Node From End of List)
solovedeng最后编辑于2025-07-04
19. 删除链表的倒数第 N 个节点(Remove Nth Node From End of List)
Medium
给定链表的头结点 head,删除链表的倒数第 n 个节点,并返回链表的头结点。
示例:
- 输入:
head = [1,2,3,4,5],n = 2→ 输出:[1,2,3,5] - 输入:
head = [1],n = 1→ 输出:[] - 输入:
head = [1,2],n = 1→ 输出:[1]
约束:
- 链表长度
sz满足1 <= sz <= 30。 0 <= Node.val <= 100。1 <= n <= sz。
进阶(Follow up): 是否可以一次遍历完成?
思路与实现(双指针,单次遍历)
要求一次遍历完成删除倒数第 n 个节点,常用做法是 双指针(快慢指针):
- 设定两个指针
fast和slow,都指向链表头(或使用哨兵节点简化边界情况)。 - 先让
fast向前走n步。此时如果fast为nullptr,说明要删除的是头结点,直接返回head->next即可(或使用哨兵节点更统一)。 - 然后同时移动
fast和slow,直到fast到达链表末尾。此时slow指向的是要删除节点的前驱节点(即slow->next是目标节点)。 - 调整指针
slow->next = slow->next->next完成删除,返回头结点(若使用哨兵返回dummy.next)。
使用哨兵(dummy)节点可以统一处理删除头结点等边界情况,代码更整洁。
C++ 实现
1 | class Solution { |
- 时间复杂度: O(sz)(单次遍历)
- 空间复杂度: O(1)
作者想说的话:
使用哨兵节点能把头结点被删除的特殊情况纳入统一处理,双指针(快慢)先让快指针领先 n 步再同步前进,最终慢指针正好停在待删除节点的前驱位置,单次遍历即可完成任务,代码简洁且稳健。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果



