You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java LinkedList能否获取Node类?有无支持O(1)节点删除的链表实现库?

问题1:是否可以获取Java标准库LinkedList的内部Node对象
  • 公开API层面完全不支持:Node是LinkedList定义的私有静态内部类,所有涉及Node操作的方法均未对外暴露,你无法通过官方提供的正常接口持有Node实例。
  • 反射仅能作为实验性方案使用:虽然通过反射可以突破私有访问限制拿到Node实例,但该方式兼容性极差,不同JDK版本的LinkedList实现可能存在差异,同时在开启安全管理器的环境下会直接被拦截,完全不建议在生产环境使用。
问题2:支持持有节点引用、O(1)复杂度删除的双向链表实现

针对你要实现MaxStack的场景,这里提供两种可行方案:

方案1:自定义简易双向链表(最推荐)

你需要的能力非常轻量,自定义双向链表的开发成本极低,且完全可控,完全适配你的需求,核心结构示例如下:

public class CustomLinkedList<E> {
    // 公开Node类,允许外部持有引用
    public static class Node<E> {
        public E item;
        public Node<E> prev;
        public Node<E> next;
        public Node(E item) {
            this.item = item;
        }
    }

    private Node<E> head;
    private Node<E> tail;
    private int size;

    // 尾插元素,返回新建的节点引用,供你存入最大堆
    public Node<E> addLast(E element) {
        Node<E> newNode = new Node<>(element);
        if (tail == null) {
            head = tail = newNode;
        } else {
            newNode.prev = tail;
            tail.next = newNode;
            tail = newNode;
        }
        size++;
        return newNode;
    }

    // 传入已知节点执行删除,时间复杂度O(1)
    public void remove(Node<E> node) {
        if (node.prev != null) {
            node.prev.next = node.next;
        } else {
            head = node.next;
        }
        if (node.next != null) {
            node.next.prev = node.prev;
        } else {
            tail = node.prev;
        }
        size--;
    }

    // 补充你需要的其他方法,比如获取尾节点、遍历、获取size等
}

基于这个自定义链表结合最大堆,就可以实现你要的O(log n)复杂度的删除操作。
额外补充:如果你的MaxStack仅需要支持栈顶压入、栈顶弹出、获取最大值三个基础操作,不需要随机删除中间节点,完全可以用更简单的双栈方案:一个普通栈存储插入的元素,另一个辅助栈存储每个位置对应的当前最大值,所有操作复杂度均为O(1),不需要引入堆和自定义链表,实现更简单。

方案2:使用第三方库的现成实现

常用的Java工具库就提供了支持公开节点操作的双向链表实现,允许开发者持有节点引用,实现O(1)时间复杂度的删除操作。

内容的提问来源于stack exchange,提问作者user7858768

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:06:01