LeetCode19-删除链表的倒数第N个节点

题目链接

英文链接:https://leetcode.com/problems/remove-nth-node-from-end-of-list

中文链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

题目详述

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

示例:

1
2
3
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

题目详解

  • 使用双指针 first 和 second,一个先走,一个后走。
  • 为了方便删除头结点的操作,可以新建一个哑结点作为辅助,让它临时充当头结点的角色。
  • first 可以先走 n 步或 n+1 步,然后让两个指针一起走。
  • 当 first 为 null 时,如果 first 先走 n 步,此时 second 指向待删除结点;如果 first 先走 n+1 步,此时 second 指向待删除结点的上一个结点。
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
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class LeetCode_00019 {

public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
for (int i = 1; i <= n + 1; ++i) {
first = first.next;
}
// 找到待删除结点的上一个结点
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}
}