> 文档中心 > LeetCode 练习——19. 删除链表的倒数第 N 个结点

LeetCode 练习——19. 删除链表的倒数第 N 个结点

文章目录

  • 1.题目描述
  • 2.思路
    • 2.1 代码
    • 2.2 测试结果
  • 3.总结

1.题目描述

删除链表的倒数第 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]

2.思路

2.1 代码

删除链表节点的方法是让删除节点的前一个节点的 next 指向待删除节点的 next 即可,因此本题需要先找到待删除节点的前一个节点。

删除链表倒数第 n 个节点,这里使用一个 fast 指针先走 n 步,然后再使用一个 slow 指针和 fast 同时往前走,当fast指针走到最后一个节点时候停止,此时 slow 指针指向的节点即倒数第 n 个节点的前一个节点,此时使用 slow.next = slow.next.next 即可将倒数第 n 个节点删除。需要注意的是,当 fast 指针先前进 n 步之后 fast 指针指向 null ,则表示当前需要删除头节点,即 n 等于链表长度,此时返回 head.next。步骤如下:

  1. 先让 fast 指针先前进 n 步;
    LeetCode 练习——19. 删除链表的倒数第 N 个结点
  2. fast 指针和 slow 指针同时前进,直到 fast 指针的 next 指向 null 为止;
    LeetCode 练习——19. 删除链表的倒数第 N 个结点
  3. 让 slow 指针的 next 指向 slow.next.next
    LeetCode 练习——19. 删除链表的倒数第 N 个结点

代码如下:

class Solution {    public ListNode removeNthFromEnd(ListNode head, int n) { if (head.next == null) {     return null; } ListNode fast = head; ListNode slow = head; while (n > 0) {     fast = fast.next;     n--; } if (fast == null) {     return head.next; } while (fast.next != null) {     fast = fast.next;     slow = slow.next; } slow.next = slow.next.next; return head;    }}

2.2 测试结果

通过测试
在这里插入图片描述

3.总结

  • 删除链表节点只需让待删除节点的前一个节点的 next 指向待删除节点的 next 节点即可
  • 使用 fast 指针先前进 n 步,然后使用 slow 指针和 fast 指针同时前进的方式找到待删除节点的前一个节点
  • 当 fast 指针先前进 n 步之后 fast 指向 null ,表示此时需要删除头节点,直接返回头节点的 next 即可