code: final Node<E> succ(Node<E> p) {
          // TODO: should we skip deleted nodes here?
          Node<E> q = p.next;
          // j2objc: q == p.next == sentinel means node GC-unlinked
          return (sentinel() == q) ? first() : q;
      }
docs: Returns the successor of p, or the first node if p.next has been
  linked to self, which will only be true if traversing with a
  stale pointer that is now off the list.