public E remove() {return removeFirst(); //删除第一个元素}
public E removeFirst() {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;final Node<E> next = f.next;f.item = null;f.next = null; // help GC 1first = next; 2if (next == null)last = null;elsenext.prev = null; 3size--;modCount++;return element;}

public E removeLast() {final Node<E> l = last;if (l == null)throw new NoSuchElementException();return unlinkLast(l);}
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 1last = prev; 2if (prev == null)first = null;elseprev.next = null;size--;modCount++;return element;}

public E remove(int index) {checkElementIndex(index);return unlink(node(index));}
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) { // 如果X为头指针first = next; // 让first指针指向next} else {prev.next = next;x.prev = null;}if (next == null) { // 如果X为尾指针last = prev; // 让last指针指向prev} else {next.prev = prev;x.next = null;}x.item = null;size--;modCount++;return element;}

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;}
public void clear() {// Clearing all of the links between nodes is "unnecessary", but:// - helps a generational GC if the discarded nodes inhabit// more than one generation// - is sure to free memory even if there is a reachable Iterator// 从头到尾断开所有的引用关系for (Node<E> x = first; x != null; ) {Node<E> next = x.next;x.item = null;x.next = null;x.prev = null;x = next;}first = last = null;size = 0;modCount++;}
