//添加头部元素 private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode;
//原来first==null,说明当前链表为空链表,则last也指向新加入的头部元素 if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; }
//追加尾部元素 void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode;
//原来的last==null,说明当前链表为空链表,则first也指向新加入的尾部元素 if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }
//在某检点前插入元素,因为是内部使用,所以保证了succ!=null,并且保证succ是当前链表上的节点 void linkBefore(E e, Node<E> succ) { final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode;
//指定节点的前缀==null,说明指定的节点为first,则更新first if (pred == null) first = newNode; //否则,指定节点的前驱的后缀为插入的节点 else pred.next = newNode; size++; modCount++; }
//删除第一个节点,删除节点需要把节点的前驱,元素,后缀都设置为null,帮助GC 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; }
//删除最后一个节点,删除节点需要把节点的前驱,元素,后缀都设置为null,帮助GC 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; if (prev == null) first = null; else prev.next = null; size--; modCount++; return element; }
//删除某个节点 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; }
//追加元素,和addLast是等价的 public boolean add(E e) { linkLast(e); return true; }
//删除链表中第一次出现的指定对象,通过遍历列表实现 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 boolean addAll(Collection<? extends E> c) { return addAll(size, c); }
//在指定位置插入另外一个集合的元素,如果在添加过程中,外部集合的内容被修改了,行为是不确定的 public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); //判断插入位置是否合法
Object[] a = c.toArray(); //外部集合转为数组使用,这里涉及到一次拷贝 int numNew = a.length; if (numNew == 0) //如果外部集合为空,直接返回false return false;
Node<E> pred, succ; if (index == size) { succ = null; pred = last; } else { succ = node(index); pred = succ.prev; }
for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; }
if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; }
size += numNew; modCount++; return true; }
//清空所有元素 public void clear() { // 把元素都设置为null,帮助GC 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++; }
//返回特定位置上的元素 public E get(int index) { checkElementIndex(index); return node(index).item; }
//替换指定位置上的元素 public E set(int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; }
//在指定位置插入元素 public void add(int index, E element) { checkPositionIndex(index);
if (index == size) linkLast(element); else linkBefore(element, node(index)); }
//删除指定位置上的元素 public E remove(int index) { checkElementIndex(index); return unlink(node(index)); }
//判断index是否合法 private boolean isElementIndex(int index) { return index >= 0 && index < size; }
//判断index是否可以用来add或者用来迭代。多了一个index==size的合法位置,因为可以在size上添加最后一个元素 private boolean isPositionIndex(int index) { return index >= 0 && index <= size; }
//从前往后搜索指定元素位置,如果找不到,返回-1 public int indexOf(Object o) { int index = 0; if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1; }
//从后往前搜索指定元素位置,如果找不到,返回-1 public int lastIndexOf(Object o) { int index = size; if (o == null) { for (Node<E> x = last; x != null; x = x.prev) { index--; if (x.item == null) return index; } } else { for (Node<E> x = last; x != null; x = x.prev) { index--; if (o.equals(x.item)) return index; } } return -1; }
//从头部插入元素 public boolean offerFirst(E e) { addFirst(e); return true; }
//从尾部插入元素 public boolean offerLast(E e) { addLast(e); return true; }
//获取第一个元素,如果列表为空返回null public E peekFirst() { final Node<E> f = first; return (f == null) ? null : f.item; }
//获取最后一个元素,如果列表为空返回null public E peekLast() { final Node<E> l = last; return (l == null) ? null : l.item; }
//获取并删除第一个元素,如果列表为空返回null public E pollFirst() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); }
//获取并删除最后一个元素,如果列表为空返回null public E pollLast() { final Node<E> l = last; return (l == null) ? null : unlinkLast(l); }
//栈push操作 public void push(E e) { addFirst(e); }
//栈pop操作 public E pop() { return removeFirst(); }
//删除从前往后第一个出现的相等元素 public boolean removeFirstOccurrence(Object o) { return remove(o); }
//删除从后往前第一个出现的相等元素 public boolean removeLastOccurrence(Object o) { if (o == null) { for (Node<E> x = last; x != null; x = x.prev) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = last; x != null; x = x.prev) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }
//判断是否还有元素,不是通过null而是通过size public boolean hasNext() { return nextIndex < size; }
public E next() { checkForComodification(); if (!hasNext()) throw new NoSuchElementException();
lastReturned = next; next = next.next; nextIndex++; return lastReturned.item; }
public boolean hasPrevious() { return nextIndex > 0; }
public E previous() { checkForComodification(); if (!hasPrevious()) throw new NoSuchElementException();
lastReturned = next = (next == null) ? last : next.prev; nextIndex--; return lastReturned.item; }
public int nextIndex() { return nextIndex; }
public int previousIndex() { return nextIndex - 1; }
public void remove() { checkForComodification(); if (lastReturned == null) throw new IllegalStateException();
Node<E> lastNext = lastReturned.next; unlink(lastReturned); if (next == lastReturned) next = lastNext; else nextIndex--; lastReturned = null; expectedModCount++; }
public void set(E e) { if (lastReturned == null) throw new IllegalStateException(); checkForComodification(); lastReturned.item = e; }
public void add(E e) { checkForComodification(); lastReturned = null; if (next == null) linkLast(e); else linkBefore(e, next); nextIndex++; expectedModCount++; }
public void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (modCount == expectedModCount && nextIndex < size) { action.accept(next.item); lastReturned = next; next = next.next; nextIndex++; } checkForComodification(); }
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
//获取逆向迭代器 public Iterator<E> descendingIterator() { return new DescendingIterator(); }
//逆向迭代器是基于正向迭代器的简单包装 private class DescendingIterator implements Iterator<E> { private final ListItr itr = new ListItr(size()); public boolean hasNext() { return itr.hasPrevious(); } public E next() { return itr.previous(); } public void remove() { itr.remove(); } }
// Initialize clone with our elements for (Node<E> x = first; x != null; x = x.next) clone.add(x.item);
return clone; }
//返回数组 public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item; return result; }
//返回指定类型的数组 @SuppressWarnings("unchecked") public <T> T[] toArray(T[] a) { if (a.length < size) a = (T[])java.lang.reflect.Array.newInstance( a.getClass().getComponentType(), size); int i = 0; Object[] result = a; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item;
/** * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> * and <em>fail-fast</em> {@link Spliterator} over the elements in this * list. * * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and * {@link Spliterator#ORDERED}. Overriding implementations should document * the reporting of additional characteristic values. * * @implNote * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED} * and implements {@code trySplit} to permit limited parallelism.. * * @return a {@code Spliterator} over the elements in this list * @since 1.8 */ @Override public Spliterator<E> spliterator() { return new LLSpliterator<E>(this, -1, 0); }
/** A customized variant of Spliterators.IteratorSpliterator */ static final class LLSpliterator<E> implements Spliterator<E> { static final int BATCH_UNIT = 1 << 10; // batch array size increment static final int MAX_BATCH = 1 << 25; // max batch array size; final LinkedList<E> list; // null OK unless traversed Node<E> current; // current node; null until initialized int est; // size estimate; -1 until first needed int expectedModCount; // initialized when est set int batch; // batch size for splits
LLSpliterator(LinkedList<E> list, int est, int expectedModCount) { this.list = list; this.est = est; this.expectedModCount = expectedModCount; }
final int getEst() { int s; // force initialization final LinkedList<E> lst; if ((s = est) < 0) { if ((lst = list) == null) s = est = 0; else { expectedModCount = lst.modCount; current = lst.first; s = est = lst.size; } } return s; }
public long estimateSize() { return (long) getEst(); }
public Spliterator<E> trySplit() { Node<E> p; int s = getEst(); if (s > 1 && (p = current) != null) { int n = batch + BATCH_UNIT; if (n > s) n = s; if (n > MAX_BATCH) n = MAX_BATCH; Object[] a = new Object[n]; int j = 0; do { a[j++] = p.item; } while ((p = p.next) != null && j < n); current = p; batch = j; est = s - j; return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED); } return null; }
public void forEachRemaining(Consumer<? super E> action) { Node<E> p; int n; if (action == null) throw new NullPointerException(); if ((n = getEst()) > 0 && (p = current) != null) { current = null; est = 0; do { E e = p.item; p = p.next; action.accept(e); } while (p != null && --n > 0); } if (list.modCount != expectedModCount) throw new ConcurrentModificationException(); }
public boolean tryAdvance(Consumer<? super E> action) { Node<E> p; if (action == null) throw new NullPointerException(); if (getEst() > 0 && (p = current) != null) { --est; E e = p.item; current = p.next; action.accept(e); if (list.modCount != expectedModCount) throw new ConcurrentModificationException(); return true; } return false; }
public int characteristics() { return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED; } }