我正在进行学习练习,并使用迭代器创建自己的链表。课程如下:
public class LinkedList<T> implements Iterable <T> {
private Node<T> head;
private Node<T> tail;
private int size;
public LinkedList() {
head = new Node<T>();
tail = new Node<T>();
head.setNext(tail);
tail.setPrevious(head);
size = 0;
}
public void append(T element) {
tail.getPrevious().setNext(new Node<T>(element));
tail.getPrevious().getNext().setNext(tail);
tail.getPrevious().getNext().setPrevious(tail.getPrevious());
tail.setPrevious(tail.getPrevious().getNext());
size++;
}
public void prepend(T element) {
head.getNext().setPrevious(new Node<T>(element));
head.getNext().getPrevious().setPrevious(head);
head.getNext().getPrevious().setNext(head.getNext());
head.setNext(head.getNext().getPrevious());
size++;
}
public void remove(Node<T> nodeToRemove) {
if(!isEmpty()) {
nodeToRemove.getPrevious().setNext(nodeToRemove.getNext());
nodeToRemove.getNext().setPrevious(nodeToRemove.getPrevious());
nodeToRemove.setNext(null);
nodeToRemove.setPrevious(null);
nodeToRemove.setElement(null);
nodeToRemove = null;
size--;
}
}
public boolean isEmpty() {
return size() == 0;
}
public int size() {
return size;
}
public Iterator<T> iterator() {
return new Cursor<T>(head);
}
public String toString() {
String result = "";
for(T t : this) {
result += t.toString() + "\n";
}
return result;
}
private final class Cursor<E> implements Iterator<E> {
private Node<E> current;
public <E> Cursor(Node<E> head) {
this.current = current;
}
public boolean hasNext() {
return current.getNext().getNext() != null;
}
public E next() {
current = current.getNext();
return current.getElement();
}
public void remove() {
remove(current);
}
}
}
经过相当多的研究后,实现迭代器的一个好方法是将其作为一个内在的类。但是,我在游标类中使用remove方法收到编译错误。我认为这是因为类型不匹配,但我在remove()
中得到的错误LinkedList<T>.Cursor<E>
无法应用于<Node<E>
)。
我已经和它搏斗了很长一段时间,我无法理解究竟是什么错误,我很感激您的任何见解。
答案 0 :(得分:2)
有一些问题:
您有两种名为remove
的方法。 Java认为你试图在内部remove
类中调用Cursor
,它不带参数。你必须像这样限定参考资料:
LinkedList.this.remove(current);
您的内部游标类是非静态的。非静态内部类与创建它们的外部类实例相关联。基本上,它们维护一个指向外部类对象的父指针。这对于实现迭代器是正确的,但您需要更改使用泛型的方式。非静态内部类可以使用其父类的类型参数。这意味着您可以将迭代器定义更改为:
private final class Cursor implements Iterator<T>
它将自动使用<T>
中的LinkedList
。
this.current = current;
应该是this.current = head;
hasNext
两次致电getNext()
?希望有所帮助。