Files
LeetCode/链表/8. 删除链表的倒数第 N 个结点.md
T

88 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
进阶:你能尝试使用一趟扫描实现吗?
## 思路
- 双指针
- 快指针指向 null
- 慢指针指向目标结点
## 代码
```java
/**
* 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) {
// Init: slow, fast, dummyHead
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode slow = dummyHead;
ListNode fast = dummyHead;
int cnt = 0;
while (fast != null && cnt < n) {
fast = fast.next;
cnt++;
}
if (cnt != n) {
return null;
}
while (fast != null) {
fast = fast.next;
if (fast == null) {
slow.next = slow.next.next;
return dummyHead.next;
}
slow = slow.next;
}
return dummyHead.next;
}
}
```