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