目录
1.题目描述
难度:中等
给你一个链表,删除链表的倒数第 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]
提示
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
2.题目解答
方法一:快慢指针+虚拟头节点
解题思路
- 设置虚拟节点
dummyHead
指向head
- 设定双指针
fast
和slow
,初始都指向虚拟节点dummyHead
- 移动快指针
fast
,直到slow
与fast
之间相隔的元素个数为n-1
- 同时移动
fast
与slow
,直到fast
指向尾节点,即下个节点为NULL
- 将
slow
的下一个节点指向下下个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 设置虚拟头节点
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode fastNode = dummyNode;
ListNode slowNode = dummyNode;
// 快指针比慢指针快n-1个节点
for (int i = 0; i < n; i++) {
fastNode = fastNode.next;
}
// 同步移动快慢指针
while (fastNode.next != null) {
fastNode = fastNode.next;
slowNode = slowNode.next;
}
// 删除目标节点
slowNode.next = slowNode.next.next;
return dummyNode.next;
}
}