LinkedList源码分析
1. 添加源码
1,第一次添加
public boolean add(E e) {
linkLast(e);
return true;
}
2,调用linkLast(e)
void linkLast(E e) {
//last赋值给l
final Node<E> l = last;
//newNode 此时前驱后继都为空
final Node<E> newNode = new Node<>(l, e, null);
//last指向newNode
last = newNode;
//first也指向newNode
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
2,第二次添加
void linkLast(E e) {
//此时l值有值
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
//last指向新节点
last = newNode;
if (l == null)
first = newNode;
else
//l.next指向新加的数据
l.next = newNode;
size++;
modCount++;
}
3,删除第一个元素list.remove()
源码
public E remove() {
return removeFirst();
}
public E removeFirst() {
//first第一个节点赋值给f
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
//调用
return unlinkFirst(f);
}
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
//取到头节点的值
final E element = f.item;
//头节点指向下一个next值赋值给next
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
//头节点重新指向next,此时头节点指向下一个
first = next;
if (next == null)
last = null;
else
//把头节点前驱指向空
next.prev = null;
size--;
modCount++;
return element;
}