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^5
1 <= 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网站