我必须自己制作一个自定义链表,我遇到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()
。
非常感谢任何帮助。
答案 0 :(得分:3)
你的缺陷是hasNext
应该是幂等的。它不应更新当前位置的位置。因此,代码list.setIteratorNode(currentNode.nextNode);
不应存在于hasNext
增加:
将变量currentNode
和firstNode
移动到Iterator
班级。让currentNode
成为非决赛。 currentNode
应初始化为null
。 Iterator
应该修改的唯一内容是它自己的currentNode
。
答案 1 :(得分:1)
您应该删除该行
list.setIteratorNode(currentNode.nextNode);
来自hasNext()
方法。您只想在next()
方法中更新迭代器的位置。
顺便说一下,我不喜欢你似乎将迭代器的位置存储在列表中的事实。这使得在同一列表中不可能有两个具有不同位置的迭代器。您应该将位置存储在迭代器本身中。