@Override
    public void remove() {
      if (lastRet == null) {
        throw new IllegalStateException();
      }
      fullyLock();
      try {
        Node<E> node = lastRet;
        lastRet = null;
        for (Node<E> trail = head, p = trail.next; p != null; trail = p, p = p.next) {
          if (p == node) {
            unlink(p, trail);
            break;
          }
        }
      } finally {
        fullyUnlock();
      }
    }
Returns the next live successor of p, or null if no such.

Unlike other traversal methods, iterators need to handle both: - dequeued nodes (p.next == p)
- (possibly multiple) interior removed nodes (p.item == null)
geode-core/src/main/java/org/apache/geode/internal/cache/ForceableLinkedBlockingQueue.java