JDK 1.8 LinkedList中双向迭代器实现细节小记

在学习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结点不会受到影响。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章