「日更刷题」19. 删除链表的倒数第 N 个结点

简介: 「日更刷题」19. 删除链表的倒数第 N 个结点

一、前言

每日算法坚持第三天,该专栏争取日日更新,加油

二、简介和示例

简介

LeetCode 19题, 删除链表的倒数第 N 个结点: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

链表数据结构

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode() {
    }
    public ListNode(int val) {
        this.val = val;
    }
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
复制代码

示例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

三、解题

思路分析

  • 为了方便对头节点操作, 还是使用虚拟头节点 dummy 来做
  • 创建一个链表 slow 表示当前节点
  • 根据提示可知 n < 链表长度的
  • 所以使用一个链表 fast 去获取当前节点后第n个节点
  • 搞一个链表 prev 专门记录当前节点的上一个节点
  • 循环终止条件是 fast 链表的 next == null
  • 循环内操作
  • prev 存储当前节点
  • slow = slow.next
  • fast = fast.next
  • 循环结束之后, 上一节点是 prev, 下一节点是 slow.next
  • 又因为我们的 dummy有一个虚拟头节点, 所以返回值为 dummy.next

这边我以为就结束了, 但是看大佬的代码, 还有一步 slow.next = null, 去释放掉了 slow.next

四、代码展示

public static  ListNode removeNthFromEnd(ListNode head, int n) {
    // 为了方便对头节点操作, 还是使用虚拟头节点 `dummy` 来做
    ListNode dummy = new ListNode(-1);
    dummy.next = head;
    // 创建一个链表 `slow` 表示当前节点
    ListNode slow = dummy;
    // 使用一个链表 `fast` 去获取当前节点后第n个节点
    ListNode fast = dummy;
    // 根据提示可知 n < 链表长度的, 所以使用fast去判断slow节点是不是倒数第n个节点
    while (n-- > 0) {
        fast = fast.next;
    }
    // 记住 待删除节点slow 的上一节点
    ListNode prev = null;
    // 循环终止条件是 `fast` 链表的 next == null
    while (fast != null) {
        // prev 存储当前节点
        prev = slow;
        // slow和fast节点向下进一步
        slow = slow.next;
        fast = fast.next;
    }
    // 循环结束之后, 上一节点是 prev, 下一节点是 slow.next, 删除show节点
    prev.next = slow.next;
    // 下面是看大佬代码的收获
    // 释放 待删除节点slow 的next指针, 这句删掉也能AC
    slow.next = null;
    return dummy.next;
}
复制代码

五、提交代码

网络异常,图片无法展示
|

注: 本篇文章代码部分采用了代码随想录大佬的代码在变量命名, fast链表的确认和最后一步的释放内存上比我自己的方式精简且清晰明了很多


目录
相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
24天前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
13 1
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
49 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
6月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
56 2
|
6月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
53 1