🧩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 · 链表