降序ListNode迭代器实现

时间:2015-10-13 19:38:38

标签: java linked-list deque

我在这个方法中的目标是为迭代器编写实现,该迭代器按降序迭代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();
}

}

1 个答案:

答案 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实施应该从这里直截了当。请注意,根据良好的编码标准,以ishas开头的方法很少会更改对象的状态。

请注意,我也省略了可能的空检查以及其他可能的特定检查,这只是方向的一个例子。

更新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,只有开始编码,反之亦然。