在学习LinkedList源码时,发现对它的内部迭代器ListItr的实现有几个函数费了一番脑筋,记录下来供以后复习使用。这几个函数是next()、previous()以及remove()。
先把它们的源码贴上来:
public E next() {
checkForComodification();
if (!hasNext())
throw new NoSuchElementException();
lastReturned = next;
next = next.next;
nextIndex++;
return lastReturned.item;
}
public E previous() {
checkForComodification();
if (!hasPrevious())
throw new NoSuchElementException();
lastReturned = next = (next == null) ? last : next.prev;
nextIndex--;
return lastReturned.item;
}
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++;
}
next比较直观,next后移一位,lastReturned位于next之前。而previous在执行后,lastReturned与next相等了。这样就导致在remove操作中删除掉lastReturned结点后,需要增加一次判断。若上一次操作是previous(),则此时删除lastReturned后,next也会“悬空”,需要将其指向lastNext。若上一次操作是next(),则删除lastReturned时next结点不会受到影响。