删除链表的倒数第 N 个结点
2026年3月31日大约 1 分钟
删除链表的倒数第 N 个结点
使用的方法
- 快慢指针:通过使用两个指针,快指针先移动 n 步,然后快慢指针同时移动,直到快指针到达链表末尾,此时慢指针指向的就是需要删除的节点。
解题思路
- 首先,创建一个虚拟头节点
dummy,并将其next指向链表的头节点head。这样可以简化删除操作,尤其是当需要删除头节点时。 - 然后,初始化两个指针
start和end,都指向dummy。接下来,使用一个循环让start指针先移动n步,以便在后续的移动中保持start和end之间的距离为n。 - 接下来,使用另一个循环同时移动
start和end指针,直到start指针到达链表的末尾。此时,end指针指向的节点就是需要删除的节点的前一个节点。 - 最后,调整
end指针的next指向,跳过需要删除的节点,从而完成删除操作。最后返回dummy.next,即新的链表头节点。
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode start = dummy,end = dummy;
while(n != 0){
start = start.next;
n--;
}
while(start.next != null){
start = start.next;
end = end.next;
}
end.next = end.next.next;
return dummy.next;
}
}