对于学校,我必须制作一种像队列一样的链表。 我的节点有3个属性:
我还必须使列表可迭代,以便实现接口。
我现在遇到的问题是,如果列表中有4个项目,则只显示3个项目。
因此,例如,如果列表中包含4个字符串,则' a',' b',' c'并且' d'输出是:
b
c
d
我的hasNext方法如下:
@Override
public boolean hasNext() {
return node.getRight() != null;
}
我的下一个方法如下:
@Override
public T next() {
node = node.getRight();
Object item = node.getItem();
return (T)item;
}
如果我返回节点的项而不是右边的节点,我得
a
b
c
作为回报,但这也不好,因为它会跳过最后一个。当你下次阅读API时,应该返回下一个值,所以我猜我的下一个方法必须保持原样。
答案 0 :(得分:2)
迭代器的方法应该实现为:
@Override
public T next() {
Object item = node.getItem();
node = node.getRight();
return (T)item;
}
@Override
public boolean hasNext() {
return node != null;
}
想想其他迭代器。在第一次调用next()
时,它们返回第一个元素,然后它们向前移动到第二个元素。当您指向最后一个元素时,next()
应该返回它并向前移动(即指向null
)。为了能够做到这一点,hasNext
内的测试应该在当前项目上,而不是在下一个项目上,否则你无法获得最后一个元素。
答案 1 :(得分:0)
您可能通过将selectItem=-1
属性设置为第一个节点来初始化node
属性,因此next()调用指向第二个节点。尝试检查第一个节点:
boolean first = true;
@Override public T next() {
if (!first) {
node = node.getRight();
}
else
first = false;
Object item = node.getItem();
return (T)item;
}