Java8——LinkedList源码详解

LinkedList

在这里插入图片描述
LinkedList是通过一个双向链表来实现的,它允许插入所有元素,包括null,它是线程不同步的

双向链表的结构如下图
在这里插入图片描述
双向链表每个节点除了数据域以外,还有一个前指针和后指针,分别指向前驱节点和后继节点,另外,双向链表还有一个first指针,指向头结点,last指针指向尾结点。

属性

//链表的节点个数
transient int size = 0;
//指向头节点的指针
transient Node<E> first;
//指向尾节点的指针
transient Node<E> last;

方法

节点结构

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;
	 } 
 }

Node 是在 LinkedList 里定义的一个静态内部类,它表示链表每个节点的结构,包括一个数据域 item,一个后置指针 next,一个前置指针 prev。

添加元素

对于链表这种数据结构来说,添加元素的操作无非就是在表头/表尾插入元素,又或者在指定位置插入元素。因为 LinkedList 有头指针和尾指针,所以在表头或表尾进行插入元素只需要 O(1) 的时间,而在指定位置插入元素则需要先遍历一下链表,所以复杂度为 O(n)。

表头添加元素过程
在这里插入图片描述
当向表头插入一个节点时,很显然当前节点的前驱一定为 null,而后继结点是 first 指针指向的节点,当然还要修改 first 指针指向新的头节点。除此之外,原来的头节点变成了第二个节点,所以还要修改原来头节点的前驱指针,使它指向表头节点,
源码的实现如下:

private void linkFirst(E e) {
   
 	final Node<E> f = first;
 	//当前节点的前驱指向 null,后继指针原来的头节点
 	final Node<E> newNode = new Node<>(null, e, f);
 	//头指针指向新的头节点
 	first = newNode;
	 //如果原来有头节点,则更新原来节点的前驱指针,否则更新尾指针
 	if (f == null)
 		last = newNode;
 	else
	    f.prev = newNode;
 		size++;
		modCount++;
}

向表尾插入元素
在这里插入图片描述
当向表尾插入一个节点时,很显然当前节点的后继一定为 null,而前驱结点是 last 指针指向的节点,然后还要修改 last 指针指向新的尾节点。此外,还要修改原来尾节点的后继指针,使它指向新的尾节点
源码的实现如下:

void linkLast(E e) {
   
 	final Node<E> l = last;
 	//当前节点的前驱指向尾节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值