leetcode 19. 删除链表的倒数第 N 个结点 java解法

leetcode 19. 删除链表的倒数第 N 个结点

删除链表的倒数第 N 个结点

题目描述

给你一个链表,删除链表的倒数第 n 个结点,并返回链表的头结点。

解题思路

为了删除倒数第 n 个节点,我们可以使用双指针法。首先,我们将第一个指针 first 移动到链表的第 n+1 个节点,然后将第二个指针 second 移动到链表的开头。接着,我们同时移动 firstsecond 直到 first 指向链表的末尾。此时,second 就是倒数第 n 个节点的前一个节点,我们可以修改指针进行删除操作。

最初解法

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyHead = new ListNode(-1, head);
        int length = getLength(head);
        ListNode cur = dummyHead;
        for(int i = 0; i < length - n - 1; i++) {
            cur = cur.next;
        }
        cur.next = cur.next.next;
        return dummyHead.next;
    }

    private int getLength(ListNode head) {
        int length = 0;
        while(head != null) {
            length++;
            head = head.next;
        }
        return length;
    }
}

最初解法思路:

  • 使用 getLength 方法获取链表长度。
  • 使用 dummyHead 辅助节点,然后找到倒数第 n 个节点的前一个节点进行删除。

问题:

  • 需要遍历两次链表,效率相对较低。

优化解法

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyHead = new ListNode(-1, head);
        ListNode first = head;
        ListNode second = dummyHead;
        for(int i = 0; i < n; i++) {
            first = first.next;
        }
        while(first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        return dummyHead.next;
    }
}

优化解法思路:

  • 使用双指针 firstsecond,它们之间的距离是 n+1
  • 移动 first 指针到链表末尾,second 指针就会指向倒数第 n 个节点的前一个节点。

优点:

  • 一次遍历解决问题,提高了效率。

复杂度分析

最初解法:

  • 时间复杂度:O(N)(遍历两次链表)
  • 空间复杂度:O(1)(只使用了常数额外空间)

优化解法:

  • 时间复杂度:O(N)(遍历一次链表)
  • 空间复杂度:O(1)(只使用了常数额外空间)

相关推荐
FQNmxDG4S5 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
穿条秋裤到处跑5 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje6 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211237 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯9 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图