java中linkedlist基于双向链表实现,增删操作时间复杂度为o(1)(已知节点引用),按索引查找为o(n),其node节点含item、prev、next字段,首尾节点由first和last直接维护。

Java 中的 LinkedList 是基于双向链表实现的,它的增删改查操作都围绕节点(Node)的指针操作展开,不涉及数组扩容或移动元素,因此插入和删除在任意位置都是 O(1)(前提是已知节点引用),但按索引查找是 O(n)。
节点结构:双向链表的核心
LinkedList 内部定义了一个私有静态内部类 Node:
private static class Node<e> {
E item;
Node<e> next;
Node<e> prev;
Node(Node<e> prev, E element, Node<e> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
</e></e></e></e></e>
每个节点保存数据(item)、前驱(prev)和后继(next)引用。头节点(first)和尾节点(last)由两个成员变量直接维护,初始为 null。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
添加元素:从头、尾或中间插入
添加本质是创建新节点,并调整相邻节点的 prev 和 next 指针。
-
addFirst(e):新建节点,
next指向原first,若原first非空则其prev指向新节点;更新first = newNode;若原链表为空,last也指向新节点。 -
addLast(e)(即
add(e)):类似,新节点prev指向原last,原last.next指向它;更新last;空链表时同步更新first。 -
add(index, e):先调用
node(index)查找插入位置的前一个节点(或后一个),再执行“两步断连+四步重连”——断开前后连接,让新节点接入,再修复邻居指针。例如在中间插入:pred.next = newNode,newNode.prev = pred,newNode.next = succ,succ.prev = newNode。
删除元素:跳过目标节点,重连前后
删除某节点(如 removeFirst()、removeLast() 或 remove(index))只需让其前后节点互相指向,再将该节点字段置 null(帮助 GC)。
-
removeFirst():若非空,取
first.item,令first = first.next;若新first为null,说明删完为空,则last = null;否则原first.prev = null。 -
remove(index):先
node(index)定位节点x,记其prev为pred、next为next;然后pred.next = next,next.prev = pred;若pred为null,说明删的是头节点,更新first;若next为null,更新last。
查找与修改:依赖遍历,无随机访问优化
LinkedList 没有索引数组,所有按位置操作都要从头或尾开始走指针。
-
get(index):调用私有方法
node(int index)。它会判断index更靠近头还是尾(比较index与size >> 1),决定从first正向遍历还是从last反向遍历,减少一半平均步数。 -
set(index, e):先
node(index)找到节点,再直接替换其item字段,O(1) 修改本身,但查找仍是 O(n)。 - 注意:
contains(e)、indexOf(e)等方法都需要逐个equals()比较,最坏 O(n)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










