1、removeLast(),删除尾部元素
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
点击unlinkLast进入如下代码
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null; // help GC
last = prev; //把last指针重新指向原先的倒二指针
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}
形参l表示最后一个节点的指针。
把最后一个节点的item和prev设置为null,是为了方便GC。
2、removeFirst,删除头节点
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
点击unlinkFirst进入如下代码:
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
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;
}
其实就是将first指向原先第2个节点,然后将原第1个节点的item和next都设置为null。
3、poll()函数
public E poll() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}
4、remove(int index),删除指定下标
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
点击unlink方法进入如下
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
modCount++;
return element;
}
5、总结
1)LinkedList基于双向链表。插入、获取、删除,都可以从队头、队尾,很适合做队列。