我在这个方法中的目标是为迭代器编写实现,该迭代器按降序迭代listNode的元素。 (从后面到前面)我附加了升序迭代器的实现。任何正确方向的帮助将不胜感激。
public MyDescendingDequeIterator(ListNode<E> back, ListNode<E> front) {
frontOfList = front;
nextToReturn = back;
while (nextToReturn.next != null) {
nextToReturn = nextToReturn.next;
}
}
public boolean hasNext() {
if (nextToReturn == null){
return false;
} else {
ListNode<E> current = frontOfList;
return true;
}
}
public E next() {
ListNode<E> current = frontOfList;
while ( current.next != nextToReturn ) {
current = current.next;
}
nextToReturn = current;
return nextToReturn.data;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
答案 0 :(得分:0)
如果它是一个只有next()方法的常规ListNode实现,那么你需要实现prev()方法 - 在这种情况下,hasNext非常类似于你所使用的方法。已经实施。
另一种方法是保持列表的开始并每次迭代,直到下一个元素为nextToReturn(然后更新nextToReturn)。这是不太理想的方法,因为您需要从长度为m的列表的末尾迭代O(m ^ 2);
更新:
好的,首先你不需要多少元素,因为它与Iterator的想法完全相反。
所以,让我们说
public MyDescendingDequeIterator(ListNode<E> back, ListNode<E> front) {
frontOfList = front;
nextToReturn = frontOfList;
current = frontOfList;
}
接下来要做的就是设置nextToReturn = back
(现在你根本不使用back
)。而且你并不需要两个变量,因为nextToReturn
是当前的迭代器。
所以它转换为:
public MyDescendingDequeIterator(ListNode<E> back, ListNode<E> front) {
frontOfList = front;
nextToReturn = back;
}
现在让我们看一下next()
方法
正如我所说,你在这里不需要索引for
,因为你已经拥有了具有下一个属性的frontOfList。
所以它可能是:
public E next() {
ListNode<E> current = frontOfList;
while ( current.next != nextToReturn ) {
current = current.next;
}
nextToReturn = current;
return nextToReturn.data;
}
hasNext
实施应该从这里直截了当。请注意,根据良好的编码标准,以is
或has
开头的方法很少会更改对象的状态。
请注意,我也省略了可能的空检查以及其他可能的特定检查,这只是方向的一个例子。
更新2:
正如我现在想的那样,你不需要构造函数中的第二个参数,只需这样:
public MyDescendingDequeIterator(ListNode<E> front) {
frontOfList = front;
nextToReturn = front;
// calculate back here instead of get it as param
while ( nextToReturn.next != null) {
nextToReturn = nextToReturn.next;
}
}
更新3:
看,它只是开始编写一些代码并希望它能够正常工作,你应该先坐下来然后开始用纸上的箭头绘制框,然后尝试理解每个功能应该这样做。
正如我之前所说,您的hasNext()
方法有一个错误,一般不正确。你为什么检查空?你从后面移动到前面,你在前面的某个地方有空吗?你需要什么current
对象。它做了什么?
next()
方法还应该检查您是否已经在第一个元素。否则它会(并且确实)在最后一个元素处导致NullPointerException。
首先尝试调试,或者至少添加一些打印输出,这有助于了解错误的位置。但首先你应该建立algorythm,只有开始编码,反之亦然。