19_删除链表的倒数第 N 个结点[MEDIUM]
约 345 字大约 1 分钟
2026-03-21
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1: 
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]解题思路
快慢指针
- 引入哨兵节点 (Dummy Node):在原链表头节点前增加一个辅助节点 dummy。
- 设置快慢指针:初始化两个指针
fast和slow,最初都指向 dummy。 - 快指针先行:让
fast先向前移动n步。此时,fast和slow之间间隔了n个节点。 - 同步移动:同时移动
fast和slow,直到fast到达链表的末尾(即fast.next == null)。 - 由于两者始终保持
n的间距,当fast到达末尾时,slow恰好指向倒数第n个节点的前驱节点。
引入 Dummy Node 的好处是即使要删除的是头节点,逻辑也能保持一致。
Java 实现
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) return null;
ListNode dummy = new ListNode(0,head);
ListNode fast = dummy;
ListNode slow = dummy;
for (int i = 0; i < n; i++){ // 快指针先走 n 步
fast = fast.next;
}
while(fast.next != null){ // 同时移动,直到快指针到达最后一个节点
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next; // 此时 slow 位于待删除节点的前一个位置
return dummy.next;
}