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

相关推荐
一只鱼^_1 小时前
牛客周赛 Round 99
java·数据结构·c++·算法·贪心算法·动态规划·近邻算法
玩代码2 小时前
CompletableFuture 详解
java·开发语言·高并发·线程
剪一朵云爱着2 小时前
力扣2438. 二的幂数组中查询范围内的乘积
算法·leetcode
人生在勤,不索何获-白大侠3 小时前
day21——特殊文件:XML、Properties、以及日志框架
xml·java·开发语言
Dcs6 小时前
用不到 1000 行 Go 实现 BaaS,Pennybase 是怎么做到的?
java
Cyanto7 小时前
Spring注解IoC与JUnit整合实战
java·开发语言·spring·mybatis
qq_433888937 小时前
Junit多线程的坑
java·spring·junit
gadiaola8 小时前
【SSM面试篇】Spring、SpringMVC、SpringBoot、Mybatis高频八股汇总
java·spring boot·spring·面试·mybatis
写不出来就跑路8 小时前
WebClient与HTTPInterface远程调用对比
java·开发语言·后端·spring·springboot
Cyanto8 小时前
深入MyBatis:CRUD操作与高级查询实战
java·数据库·mybatis