添加元素源码分析
构造函数
// 无参构造
public LinkedList() {
}
// 拷贝构造
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
-
无参构造,什么都不执行,first、last为null,size=0,插入第一个值,first和last都指向它,size=1
静态内部类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;
}
}
添加节点的源码
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
// l指向最后一个节点
final Node<E> l = last;
// 第一个参数是prev,第二个参数是element,第三个参数是next
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
// 如果l为null,也就是这次是添加第一个元素
first = newNode;
else
// l不为null,就把它添加到尾巴上
l.next = newNode;
size++;
modCount++;
}
删除节点源码分析
对于方法remove()
public E remove() {
// 删除第一个节点
return removeFirst();
}
public E removeFirst() {
final Node<E> f = first;
// 如果链表不存在的话,抛出异常
if (f == null)
throw new NoSuchElementException();
// 让头结点失去连接
return unlinkFirst(f);
}
private E unlinkFirst(Node<E> f) {
final E element = f.item;
final Node<E> next = f.next;
// 把节点的元素置空
f.item = null;
f.next = null; // help GC
first = next;
// 判断链表是否只有一个元素
if (next == null)
last = null;
else
// 头结点的前指针置空
next.prev = null;
size--;
modCount++;
return element;
}