一、LinkedList数据结构
LinkdList底层是由双向链表构成的,并且头结点不存放数据。
LinkedList继承了AbstractSequentialList抽象类,由AbstractSequentialList继承了Abstract类。LinkedL实现了Deque接口,Deque接口继承了Queue接口。
Node结点
因为是双向链表,每个结点都有前驱结点和后继结点。Node结点一共有三个属性:item代表结点值,prev代表结点的前一个结点,next代表结点的后一个结点。结点的定义如下:
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;
}
}
在LinkedL中定义了两个变量分别来指向链表的第一个结点和最后一个结点
transient Node<E> first;//第一个结点
transient Node<E> last;//最后一个结点
存储链表的长度
transient int size = 0;
二、add()操作
public boolean add(E e) {
linkLast(e);//向链表最后添加结点
return true;
}
void linkLast(E e) {
final Node<E> l = last;//链表的最后一个结点
final Node<E> newNode = new Node<>(l, e, null);//建立结点对象,前一个结点为原链表的最后一个结点,后一个结点为null,中间item是要添加的结点
last = newNode;
if (l == null)//最后一个结点为null,表示链表为空,添加的结点则是链表中的第一个结点
first = newNode;//让原链表的第一个结点为新添加的链表
else
l.next = newNode;//链表不为空,则让原链表的最后一个结点指向新添加的结点
size++;//链表长度自增
modCount++;
}
总结:
Link