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
相关产品推荐
相关产品推荐

