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)(只使用了常数额外空间)

相关推荐
asdfg125896310 分钟前
一个例子理解Java中的函数式接口
java·函数式接口
toolsmith14 分钟前
一个商业软件的License校验,居然把验签的证书放在了License文件里
java
wuminyu17 分钟前
JDK21 FFM异步读取MSG_ZEROCOPY错误队列揭秘
java·linux·c语言·jvm·c++
存在morning23 分钟前
【PySpark 学习笔记 三】DataFrame API 入门
android·java·数据库
AC赳赳老秦25 分钟前
企业标签体系搭建:基于 OpenClaw 采集的多维度公开数据,构建企业画像标签库
java·运维·服务器·python·信息可视化·deepseek·openclaw
智嵌研习社28 分钟前
Ollama 本地大模型完全配置指南:Modelfile 参数与系统环境变量深度解析
java·开发语言
Crawl1 小时前
5.登录与分页功能分析
java·后端
今天AI了吗1 小时前
AI Agent 在数据分析领域的落地判断:哪些场景真的需要 Agent
java·数据库·人工智能·python·sql·数据分析·copilot
SimonKing1 小时前
SwitchHosts V5大改版,我发现了这些惊喜和坑
java·后端·程序员
淡海水1 小时前
03-03-线性-LinkedList-T-源码不变式与选择边界
windows·链表·c#·编译·linkedlist·clr·机器码