publicbooleanadd(E e){linkLast(e);returntrue;}voidlinkLast(E e){final Node<E> l = last;// newNode的prev节点设置为last节点final Node<E> newNode =newNode<>(l, e, null);
last = newNode;if(l == null)
first = newNode;else
l.next = newNode;// 将newNode 节点设置为l的下一个节点,与前面创建节点构成了双向链表
modCount++;// Linked改变次数}
3.根据索引获取元素
public E get(int index){// 索引越界检查checkElementIndex(index);// 遍历链表获取节点信息returnnode(index).item;}
Node<E>node(int index){// assert isElementIndex(index);if(index <(size >>1)){// 索引小于总元素个数时,从前往后遍历
Node<E> x = first;for(int i =0; i < index; i++)
x = x.next;return x;}else{
索引大于元素个数,从后往前遍历
Node<E> x = last;for(int i = size -1; i > index; i--)
x = x.prev;return x;}}
publicbooleanremove(Object o){if(o == null){// 针对元素为null的特殊处理for(Node<E> x = first; x != null; x = x.next){if(x.item == null){unlink(x);returntrue;}}}else{// 遍历链表,找到第一个与o相等的元素,进行删除for(Node<E> x = first; x != null; x = x.next){if(o.equals(x.item)){// 删除元素unlink(x);returntrue;}}}returnfalse;}
E unlink(Node<E> x){// assert x != null;
要被移除的元素值
final E element = x.item;// 要被移除的元素的下一个节点nextfinal Node<E> next = x.next;//要被移除元素的前置节点prevfinal Node<E> prev = x.prev;// prev和next进行连接 prev.next = nextif(prev == null){
first = next;}else{
prev.next = next;
x.prev = null;}// prev和next进行连接 next.prev = previf(next == null){
last = prev;}else{
next.prev = prev;
x.next = null;}// 快速释放
x.item = null;
size--;
modCount++;return element;}