LeetCode 19. 删除链表的倒数第 N 个结点
题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
- 链表节点数在范围
[1, 10^5]内 1 <= Node.val <= 10^51 <= n <= 10^5
Java 实现解法
方法一:双指针法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// 使first指针移动到倒数第n个节点的位置
for (int i = 0; i < n + 1; i++) {
first = first.next;
}
// 移动first指针直到它到达链表末尾
while (first != null) {
first = first.next;
second = second.next;
}
// 删除倒数第n个节点
second.next = second.next.next;
return dummy.next;
}
}
解题思路
- 双指针法:使用两个指针
fast和slow,fast指针先移动n步,然后两个指针一起移动,直到fast.next指针到达链表末尾。fast指针先向前移动n步,这样fast和slow之间的距离就是n。- 然后同时移动
fast和slow指针,直到fast.next指针到达链表末尾。 - 当
fast.next指针到达末尾时,slow指针就位于倒数第n个节点,我们可以将其下一个节点从链表中断开,从而删除倒数第n个节点。
这种方法的时间复杂度是 O(L),其中 L 是链表的长度。空间复杂度是 O(1),因为我们只使用了常数个额外的指针。这种方法简单且高效,是解决这类问题的标准方法。
注:来源leetcode网站
















![YOLOv11[基础]】热力图可视化实践① | 视频版 | 输入为视频文件](https://i-blog.csdnimg.cn/direct/83e5f18a81614db89225cac73cae0336.png)


