我正在尝试编写自己的CustomLinkedList<E>
来快速通过我需要实现堆栈和队列的实验室。我可以在没有这个类的情况下通过实验室(因为我根本不需要实现迭代),但我想掌握这个概念,因为我还在学习java。
我现在已经运行并测试了大部分内容,但我无法使迭代器正常工作。
第一种方法是“后增量”,例如:
E result = current.getValue();
current = current.getNext();
return result;
我发现它被打破了,因为当我到达列表的末尾时,我将无法返回。我的hasNext()
只是检查当前是否为null
,因此返回的能力会丢失。
第二种方法是在创建时添加虚拟Node
,以模拟开头。它有一个问题,即确定我是否在列表的开头,因为采用这种方法,我不知道它的起点在哪里,直到它为时已晚。
Iterator(Node root)
{
current = new Node(null, null, root);
}
public E next()
{
//checks and stuff
current = current.getNext();
return current.getValue();
}
所以,问题是:是否可以只知道当前元素来实现ListIterator<>
?如果是的话,一些代码划痕会很棒。
修改
Node
:
private class Node
{
private Node prev;
private T value;
private Node next;
Node(Node prev, T value, Node next) {
this.setPrev(prev);
this.setValue(value);
this.setNext(next);
}
//getters and setters
}
CustomLinkedList<E>
:
public class CustomLinkedList<T> implements Iterable<T>{
private class Node {/**/}
private class Iterator implements java.util.ListIterator<T> {
Node current;
public Iterator(Node root) //from the first approach
{
current = root;
}
//other methods
}
Node root;
int size;
//Object methods, and some basic Collection methods
}
答案 0 :(得分:1)
我会做这样的事情:
public class CustomLinkedList<T> implements Iterable<T>{
private class Node {/**/}
private class Iterator implements ListIterator<T> {
Node next, previous;
Iterator() {
next = root;
previous = null;
}
public boolean hasNext() {
return next != null;
}
public T next() {
if ( ! hasNext()){
throw new NoSuchElementException();
}
previous = next;
next = next.getNext();
return previous;
}
public boolean hasPrevious() {
return previous != null;
}
public T previous() {
if ( ! hasPrevious() ){
throw new NoSuchElementException();
}
next = next.getPrevious();
previous = next.getPrevious();
return next;
}
}
Node root;
int size;
//Object methods, and some basic Collection methods
}
这没有实现ListIterator
接口的其他方法,但是你明白了。您需要将迭代器的光标视为在上一个元素和下一个元素之间,而不是在其中一个元素之间。有关正确实施,请参阅Jorn Vernee's link。