【问题标题】:Java - DoublyLinkedList Iterator implementationJava - 双链表迭代器实现
【发布时间】: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


【解决方案1】:

@Jorn Vernee 的评论包含正确答案:

更改实现只会使事情复杂化,例如如果 传入的标头为空? hasNext 会引发 NPE。它不会 也返回任何空元素,因为它检查当前节点 在返回之前为 null(当然,除非该 Node 包含 空)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2020-02-09
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多