java - 链表的自定义迭代器

标签 java for-loop iterator

我创建了一个自定义链接列表。我还为其制作了一个迭代器。但据我了解,程序不会在方法 size() 中进入循环。它出什么问题了?是因为我的循环或迭代器()不正确吗?每个节点都有字段:nextIndexprevIndexvalue

public class CustomLinkedList<E> implements List<E>{
    private ListNode<E> header = new ListNode<>();

    public CustomLinkedList() {
        this.header = new ListNode();
    }

    @Override
    public int size() {
        int size = 0;
        for(E it : this) {
            size++;
        }
        return size;
    }

    @Override
    public boolean isEmpty() {
        if(this.header == null){
            return true;
        } else {return false;}
    }

    @Override
    public boolean contains(Object o) {
        if(((Integer) header.getValue() == 42) && ((Integer) header.getNextIndex().getValue() == 38)) return true;
        return false;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private ListNode it = header;

            @Override
            public boolean hasNext() {
                return (it.getNextIndex() != header) && (it.getNextIndex() != null);
            }

            @Override
            public E next() {
                it = it.getNextIndex();
                return (E) it.getValue();
            }

            @Override
            public void remove()
            {
                throw new UnsupportedOperationException("Iterator is read-only");
            }
        };
    }


    @Override
    public boolean add(E e) {
        ListNode<E> temp = new ListNode<>();
        temp.setValue(e);
        if (this.size() < 1) {
            header.setValue(e);
            header.setPrevIndex(header);
            header.setNextIndex(header);
        } else {
            temp.setNextIndex(header);
            ListNode tempLast = header.getPrevIndex();
            tempLast.setNextIndex(temp);
            header.setPrevIndex(temp);
            temp.setPrevIndex(tempLast);
        }
        return true;
    }

    @Override
    public boolean remove(Object o) {
        return true;
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        throw new NotImplementedException();
    }

    @Override
    public void clear() {
        throw new NotImplementedException();
    }

    @Override
    public E get(int index) {
        throw new NotImplementedException();
    }

    @Override
    public int indexOf(Object o) {
        throw new NotImplementedException();
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        throw new NotImplementedException();
    }
}

最佳答案

header.getNextIndex() == null 开始,然后调用 add(E e) 一次。 在 add() 内部,size() 将返回 0,因此您设置 header.setPrevIndex(header)header.setNextIndex(header )

接下来再次调用add(E e)。在add()内部,size()将调用hasNext()并且hasNext()将检查(it. getNextIndex() != header) && (it.getNextIndex() != null) 这将返回 false 因为 it.getNextIndex() == header 因此 size() 将始终小于 1

您的代码中还有很多其他错误。更好的部分实现类似于

public class CustomLinkedList<E> implements List<E> {

    private ListNode<E> header;

    public CustomLinkedList() {
        this.header = null;
    }

    @Override
    public int size() {
        int size = 0;
        for (E it : this)
            size++;
        return size;
    }

    @Override
    public boolean isEmpty() {
        return header == null;
    }

    @Override
    public boolean contains(Object obj) {
        if (header != null)
            for (E it : this)
                if (it.equals(obj))
                    return true;
        return false;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private ListNode<E> it = null;

            @Override
            public boolean hasNext() {
                if (it==null && header!=null)
                    return true;
                else if (it != null)
                    return it.getNextIndex() != null;
                else
                    return false;
            }

            @Override
            public E next() {
                if (it==null)
                    it = header;
                else
                  it = it.getNextIndex(); 
                return it.getValue();
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Iterator is read-only");
            }
        };
    }

    @Override
    public boolean add(E e) {
        ListNode<E> temp = new ListNode<>();
        temp.setValue(e);
        if (header == null) {
            header = temp;
        } else {
            ListNode<E> it = header;
            while (it.getNextIndex() != null)
                it = it.getNextIndex();
            temp.setPrevIndex(it);
            it.setNextIndex(temp);
        }
        return true;
    }

}

关于java - 链表的自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42607100/

相关文章:

java - 为什么使用迭代器而不是 for 循环?

java - 无法打开 .txt 文件以读取整数

java - 可以在我的杯子里混合牛奶和咖啡

java - 移至 for 循环内的上一条语句

javascript - JS如何循环多次打开新标签

c# - 如何在 C# 中使用 for 循环从队列中检索值?

c++ - 通过指针用自定义类填充 vector - 构造函数有问题

Python zip 对象只能使用一次。这是为什么?

java - 不兼容的类型 : java. lang.String 无法转换为 String

java - 显示矩阵以获得独特的图案