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;
}
}
add
进入add后,调用linkLast
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
//之前的尾节点, 初始化为nul
final Node<E> l = last;
//新建一个节点,他的前驱节点为l即之前的尾节点
final Node<E> newNode = new Node<>(l, e, null);
//设置当前尾节点为新插入的节点
last = newNode;
//如果之前的l节点不存在,说明当前链表没数据,设置头结点为当前节点
if (l == null)
first = newNode;
else
//如果l节点存在,就将l节点的后继节点设置为当前节点
l.next = newNode;
//链表大小+1
size++;
modCount++;
}
最后逐步返回,第一次add的流程就结束了
remove(0bject o)
传对象,删除含有这个对象的数据,可能是多条
public boolean remove(Object o) {
//对象为null,删除链表中item为null的数据
if (o == null) {
//遍历链表
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null) {
//数据为null就进行断表删除
unlink(x);
return true;
}
}
} else {
//对象不为null,删除链表中item与传入的o内容相等的数据
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) {
unlink(x);
return true;
}
}
}
return false;
}
E unlink(Node<E> x) {
// assert x != null;
//将当前node节点的数据、后继、前驱节点分别取出
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
//断开前驱节点的连接
//前驱不存在,说明该节点是头节点,将头结点改为后继节点
if (prev == null) {
first = next;
} else {
//前驱存在,将前驱节点的后继改为next,并将x的前驱设置为null
prev.next = next;
x.prev = null;
}
//断开后继节点的连接
//后继不存在,说明该节点是尾节点,将尾结点改为x的前驱节点
if (next == null) {
last = prev;
} else {
//后继存在,将后继节点的前驱改为prev,并将x的后继设置为null
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
modCount++;
return element;
}