如何正确实现ListIterator的中间模型?

时间:2017-01-28 20:35:21

标签: java iterator

我正在尝试编写自己的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
}

1 个答案:

答案 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