@Override public E element() { return getFirst(); }
@Override @SuppressWarnings("NullAway") public E getFirst() { checkNotEmpty(); return peekFirst(); }
@Override @SuppressWarnings("NullAway") public E removeFirst() { checkNotEmpty(); return pollFirst(); }
@Override public void clear() { for (E e = first; e != null;) { E next = getNext(e); setPrevious(e, null); setNext(e, null); e = next; } first = last = null; }
/** Unlinks the non-null element. */ void unlink(E e) { final E prev = getPrevious(e); final E next = getNext(e); if (prev == null) { first = next; } else { setNext(prev, next); setPrevious(e, null); } if (next == null) { last = prev; } else { setPrevious(next, prev); setNext(e, null); } }
/** Unlinks the non-null last element. */ @SuppressWarnings("NullAway") E unlinkLast() { final E l = last; final E prev = getPrevious(l); setPrevious(l, null); last = prev; if (prev == null) { first = null; } else { setNext(prev, null); } return l; }
@Override @SuppressWarnings("NullAway") public E removeLast() { checkNotEmpty(); return pollLast(); }
@Override @SuppressWarnings("NullAway") public E getLast() { checkNotEmpty(); return peekLast(); }
@Override public @Nullable E pollFirst() { return isEmpty() ? null : unlinkFirst(); }
@Override public @Nullable E pollLast() { return isEmpty() ? null : unlinkLast(); }
/** * {@inheritDoc} * <p> * Beware that, unlike in most collections, this method is <em>NOT</em> a constant-time operation. */ @Override public int size() { int size = 0; for (E e = first; e != null; e = getNext(e)) { size++; } return size; }
@SuppressWarnings("NullAway") @Override @Nullable E computeNext() { return getPrevious(cursor); } };
void checkNotEmpty() { if (isEmpty()) { throw new NoSuchElementException(); } }
@Override public @Nullable E peek() { return peekFirst(); }