自制的迭代器错误

时间:2014-10-16 12:20:30

标签: java list linked-list iterator

我必须自己制作一个自定义链表,我遇到Iterator问题。 next()方法工作正常,但奇怪的是,hasNext()方法没有 这是代码:

public Iterator<T> iterator() {
    final Node<T> currentNode = this.iteratorNode;
    final MyLinkedList<T> list = this;
    final Node<T> firstNode = this.firstNode;

    return new Iterator<T>() {
        @Override
        public boolean hasNext() {
            if (list.isEmpty()) {
                return false;
            } else if (currentNode == null){
                list.setIteratorNode(firstNode);
                return true;
            } else if (currentNode.nextNode == null){
                return false;
            }
            list.setIteratorNode(currentNode.nextNode);
            return true;
        }

        @Override
        public T next() {
            if (list.isEmpty()){
                return null;
            } else if (currentNode == null){
                list.setIteratorNode(firstNode);
                return firstNode.data;
            } else if (currentNode.nextNode == null) {
                return null;
            }
            list.setIteratorNode(currentNode.nextNode);
            return currentNode.nextNode.data;
        }
    };
}

代码的组件(如isEmpty()setIteratorNode()方法正常工作。真正让我感到奇怪的是(在我看来),我基本上在{{1在} next()

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

你的缺陷是hasNext应该是幂等的。它不应更新当前位置的位置。因此,代码list.setIteratorNode(currentNode.nextNode);不应存在于hasNext

增加:

将变量currentNodefirstNode移动到Iterator班级。让currentNode成为非决赛。 currentNode应初始化为nullIterator应该修改的唯一内容是它自己的currentNode

答案 1 :(得分:1)

您应该删除该行

list.setIteratorNode(currentNode.nextNode);

来自hasNext()方法。您只想在next()方法中更新迭代器的位置。

顺便说一下,我不喜欢你似乎将迭代器的位置存储在列表中的事实。这使得在同一列表中不可能有两个具有不同位置的迭代器。您应该将位置存储在迭代器本身中。