From c81643f1893421a4f3d4467087eb347c2f279def Mon Sep 17 00:00:00 2001 From: Wonder Date: Fri, 3 Oct 2025 20:56:19 +0800 Subject: [PATCH] =?UTF-8?q?=20=F0=9F=94=84Update:=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=AC=20N=20?= =?UTF-8?q?=E4=B8=AA=E7=BB=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 链表/8. 删除链表的倒数第 N 个结点.md | 88 ++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 链表/8. 删除链表的倒数第 N 个结点.md diff --git a/链表/8. 删除链表的倒数第 N 个结点.md b/链表/8. 删除链表的倒数第 N 个结点.md new file mode 100644 index 0000000..f85dce3 --- /dev/null +++ b/链表/8. 删除链表的倒数第 N 个结点.md @@ -0,0 +1,88 @@ +# 删除链表的倒数第 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; + + } +} +``` \ No newline at end of file