LeetCode/19. 删除链表的倒数第N个节点

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

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

示例:

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

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

说明:

给定的 n 保证是有效的。

进阶:

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

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题思路比较简单,就是创建两个指针,我们为了方便称其为快慢指针,让快指针先走n步,接着让两个指针一起走,这样当快指针走到头的时候,慢指针就在要删除元素的前一个元素位置上,最后删除即可。这里需要注意,题目说明了给定的n保证是有效的,所以不会出现快指针走了好几个空指针慢指针才开始走的情况。

具体代码如下:

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
32
33
34
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head, slow = head;

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

//考虑快指针已经走到头,此时应该是删除头结点,所以直接返回头结点的下一个结点就是所求链表
if (fast == null) {
return head.next;
}

while (fast != null && fast.next != null) {
fast = fast.next;
slow = slow.next;
}
//删除链表
slow.next = slow.next.next;
return head;
}
}

Comments