簡體   English   中英

鏈表的自定義迭代器

[英]Custom iterator for linkedlist

我創建了一個自定義鏈表。 我也為此做了一個迭代器。 但據我所知,程序不會在方法size()中陷入循環。 它出什么問題了? 是關於我不正確的循環還是iterator() 每個節點都有字段: 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) . Inside . Inside的add() ,大小() will call hasNext() and hasNext() will check (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;
    }

}

您需要使用iterator hasNextnext方法來iterator元素並增加大小,例如:

@Override
public int size() {
    int size = 0;
    for(Iterator<String> it = this.iterator(); it.hasNext(); it.next()){
        size++;
    }
    return size;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM