remove(Object)
public boolean remove(Object o) { //遍历,逻辑比较简单,就不一句代码一句代码的说了 if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; } //整体逻辑就是:已经获得了一个node,那么node的前后引用关系就找到了,然后剩下的就是改引用关系 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; //如果前引用是null,就代表是头元素 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节点已经完全脱离链表,置空 x.item = null; size--; modCount++; return element; }
removeFirst()
public E removeFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return unlinkFirst(f); //方法实现上面已经写出了 }
removeLast()
public E removeLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return unlinkLast(l); // 跟之前的unlinkFirst类似就不再详细说了 }
remove(int)
public E remove(int index) { checkElementIndex(index); return unlink(node(index)); //实现有说明在前面 }
removeFirstOccurrence&removeLastOccurrence
其源码就不去实现了,这个方法的作用是在于:如果指定的删除元素在链表中就删除,(区别:删除最开始出现的&删除最后一个出现的),如果不存在链表不变
Get
getFirst() & getLast(),实现比较简单就不注释了
public E getFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item; } public E getLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return l.item; }
get(int),实现比较简单就不注释了
public E get(int index) { checkElementIndex(index); return node(index).item; } set
set(int,E)
public E set(int index, E element) { //检查索引 checkElementIndex(index); //利用node方法取出index上的节点 Node<E> x = node(index); //保存作为返回 E oldVal = x.item; //替换 x.item = element; return oldVal; } 队列操作