Java—具有Sentinel的双链接列表的迭代器应该是这样的吗?
作为练习,我正在编写自己的双链接列表实现,但我认为我不完全了解如何利用列表开头和结尾的哨兵节点。我想特别询问一下在迭代器中使用Sentinel的情况。这是我的迭代器(未完成):Java—具有Sentinel的双链接列表的迭代器应该是这样的吗?,java,data-structures,linked-list,iterator,Java,Data Structures,Linked List,Iterator,作为练习,我正在编写自己的双链接列表实现,但我认为我不完全了解如何利用列表开头和结尾的哨兵节点。我想特别询问一下在迭代器中使用Sentinel的情况。这是我的迭代器(未完成): 私有类MyIterator实现迭代器{ 私有节点电流=第一; 公共布尔hasNext(){ if(current.next.next==null)返回false; 否则返回true; } 公共交通工具{ 当前=当前。下一步; 如果(current.next==null)抛出新的NoTouchElementExceptio
私有类MyIterator实现迭代器{
私有节点电流=第一;
公共布尔hasNext(){
if(current.next.next==null)返回false;
否则返回true;
}
公共交通工具{
当前=当前。下一步;
如果(current.next==null)抛出新的NoTouchElementException();
返回当前数据;
}
}
我想知道的是,是否有任何方法可以在next()和hasNext()方法中使用tail sentinel来避免空检查。或者这样可以吗?否此代码将失败:如果
current.next
为null
您将获得NPE。hasNext()
不应该告诉您当前对象是否有下一项吗?如果当前项目下一个项目有下一个项目,则不会。这将是nextHasNext()
或hasNext()中的某个内容return current.next!=无效这是因为哨兵节点。如果下一个节点是sentinel节点,则设置为返回false。它工作得很好。哨兵的全部要点是你不会有空检查。你检查一下你是否已经到达了哨兵。
private class MyIterator implements Iterator<T> {
private Node current = first;
public boolean hasNext() {
if(current.next.next == null) return false;
else return true;
}
public T next() {
current = current.next;
if(current.next == null) throw new NoSuchElementException();
return current.data;
}
}