循环访问链表



我做了一个LinkedList,它有一个LinkedListIterator来实现接口Iterator<E>

该接口具有以下功能:

Next();
hasNext();

我正在尝试使用返回Iterator<E>对象的迭代器函数遍历我的 LinkedList。这是我的函数:

public Iterator<E> iterator(int stop) {
    if(size==0){
        throw new UnsupportedOperationException("IMPLEMENT THIS METHOD");
    }
    Iterator<E> result = new LinkedListIterator();
    for(int i = 0; i<stop; i++){
        result.next();
    }
    return result;
}

我还有一个测试类,它通过迭代器的模拟运行:

public class TestLinkedList {
    public static void main(String[] args) {
        //StudentInfo.display();
        LinkedList<Integer> xs;
        final int MAX_SIZE = 5;
        for (int stop = 0; stop<MAX_SIZE; stop++) {
            for (int start = 0; start<=stop; start++) {
                System.out.println("start="+start+", stop="+stop);
                xs = new LinkedList<Integer>();
                for (int i=0; i<MAX_SIZE; i++) {
                    xs.addLast(i);
                }
                System.out.println(xs);
                Iterator<Integer> i = xs.iterator(stop);
                while (i.hasNext()) {
                    System.out.println(i.next());
                }
            }
        }
    }
}

这是我对迭代器的另一个实现:

public Iterator<E> iterator(int start, int stop) {
    if(size == 0){
        throw new UnsupportedOperationException("IMPLEMENT THIS METHOD");
    }
    Iterator<E> result = new LinkedListIterator();
    for(int i = start; i<stop; i++){
        result.next();
    }
    return result;
}

当我运行模拟时,我得到的结果是:

start=0, stop=0
{0,1,2,3,4}
0
1
2
3
4
start=0, stop=1
{0,1,2,3,4}
1
2
3
4
start=1, stop=1
{0,1,2,3,4}
1
2
3
4
start=0, stop=2
{0,1,2,3,4}
2
3
4
start=1, stop=2
{0,1,2,3,4}
2
3
4
start=2, stop=2
{0,1,2,3,4}
2
3
4
start=0, stop=3
{0,1,2,3,4}
3
4
start=1, stop=3
{0,1,2,3,4}
3
4
start=2, stop=3
{0,1,2,3,4}
3
4
start=3, stop=3
{0,1,2,3,4}
3
4
start=0, stop=4
{0,1,2,3,4}
4
start=1, stop=4
{0,1,2,3,4}
4
start=2, stop=4
{0,1,2,3,4}
4
start=3, stop=4
{0,1,2,3,4}
4
start=4, stop=4
{0,1,2,3,4}
4

我什么时候应该得到以下结果:

// start=0, stop=0
// {0,1,2,3,4}
// 0
// start=0, stop=1
// {0,1,2,3,4}
// 0
// 1
// start=1, stop=1
// {0,1,2,3,4}
// 1
// start=0, stop=2
// {0,1,2,3,4}
// 0
// 1
// 2
// start=1, stop=2
// {0,1,2,3,4}
// 1
// 2
// start=2, stop=2
// {0,1,2,3,4}
// 2
// start=0, stop=3
// {0,1,2,3,4}
// 0
// 1
// 2
// 3
// start=1, stop=3
// {0,1,2,3,4}
// 1
// 2
// 3
// start=2, stop=3
// {0,1,2,3,4}
// 2
// 3
// start=3, stop=3
// {0,1,2,3,4}
// 3
// start=0, stop=4
// {0,1,2,3,4}
// 0
// 1
// 2
// 3
// 4
// start=1, stop=4
// {0,1,2,3,4}
// 1
// 2
// 3
// 4
// start=2, stop=4
// {0,1,2,3,4}
// 2
// 3
// 4
// start=3, stop=4
// {0,1,2,3,4}
// 3
// 4
// start=4, stop=4
// {0,1,2,3,4}
// 4

我不明白我的迭代器函数中缺少什么,有人可以帮我解决这个问题吗?

看起来您的迭代器生成不正确。您首先生成迭代器,然后使用 .next() 从前面删除stop数量的元素,然后返回一个迭代器,该迭代器将在列表的其余部分运行,直到hasNext()返回 false 时结束。您的方法应读取类似内容。

public Iterator<E> iterator(int start) {
    if(size == 0){
        throw new UnsupportedOperationException("IMPLEMENT THIS METHOD");
    }
    Iterator<E> result = new LinkedListIterator();
    for(int i = 0; i<start; i++){
        result.next();
    }
    return result;
}

为了实现止损值。我想你必须改变 LinkedListIterator 的实现,以允许属性导致hasNext()在结束之前返回错误的stop数量的元素。

最新更新