【发布时间】:2016-09-27 16:40:22
【问题描述】:
我已经实现了一个DoublyLinkedList,如下:
public class DoublyLinkedList<E> implements Iterable<E> {
protected static class Node<E> {
private E element;
private Node<E> prev;
private Node<E> next;
public Node(E e, Node<E> p, Node<E> n) {
element = e;
prev = p;
next = n;
}
public void setNext(Node<E> n) {
next = n;
}
}
protected Node<E> header;
protected Node<E> trailer;
private int size = 0;
public DoublyLinkedList() {
header = new Node<>(null, null, null);
trailer = new Node<>(null, header, null);
header.setNext(trailer);
}
现在我正在尝试实现一个迭代器,这是我想出的解决方案:
private class DLLIterator implements Iterator<E> {
private Node<E> cursor = header;
@Override
public boolean hasNext() {
return cursor != null;
}
@Override
public E next() {
if (!hasNext()) throw new NoSuchElementException("No next element.");
E element = cursor.getElement();
cursor = cursor.getNext();
return element;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Remove not supported.");
}
}
这似乎是正确的,但我对 hasNext() 方法和初始光标分配有很多疑问。不应该吗
public boolean hasNext() {
return cursor.getNext() != null;
}
?
否则,在我看来,迭代器会给我两个空元素,试图从标题和拖车中获取它们。我应该改变方法吗?
【问题讨论】:
-
这对我来说很好。更改实现只会使事情复杂化,例如如果传入的标头为空怎么办?
hasNext会引发 NPE。它也不会返回任何 null 元素,因为它会在返回之前检查当前 Node 是否为 null(当然,除非该 Node 包含 null)。 -
但这不会在第一次迭代时给我一个空元素,因为它从标题开始吗?
-
这取决于双向链表中的
header。我希望它是对第一个节点/元素的引用,如果列表为空,则为 null。 -
我应该澄清一下,header 只是指向第一个元素的指针。我将编辑问题。
标签: java algorithm data-structures linked-list iterator