19.删除链表中的倒数第N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

img

1
2
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

1
2
输入:head = [1], n = 1
输出:[]

示例 3:

1
2
输入:head = [1,2], n = 1
输出:[1]

Solution

快慢指针轻松完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 创建两个虚拟头节点,初始都指向链表的头部
ListNode fast = new ListNode(-1);
fast.next = head;
ListNode slow = new ListNode(-1);
slow.next = head;

// 用于返回结果的节点,指向慢指针的虚拟头节点
ListNode ans = slow;

// 快指针先前移n步
while (n > 0) {
fast = fast.next;
n--;
}

// 快慢指针同时移动,直到快指针到达链表的末尾
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}

// 此时慢指针指向要删除节点的前一个节点,进行删除操作
slow.next = slow.next.next;

// 返回修改后的链表头部,ans.next因为ans是虚拟头节点
return ans.next;
}
}