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

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

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

题目描述

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

解题思路

为了删除倒数第 n 个节点,我们可以使用双指针法。首先,我们将第一个指针 first 移动到链表的第 n+1 个节点,然后将第二个指针 second 移动到链表的开头。接着,我们同时移动 first 和 second 直到 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;
    }
}

优化解法思路:

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

优点:

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

复杂度分析

最初解法:

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

优化解法:

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

相关推荐
晨曦中的暮雨9 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
文丑颜不良啊10 小时前
LeetCode876~900题目解析
java·leetcode
aloha_78911 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观11 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅11 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff12 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang13 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
hhhjhl13 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
用户31268748772014 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java