2

そのため、LinkedListsをよりよく理解しようとしています。演習では、作成remove()したリンクリストクラスのイテレータクラスのメソッドを実装するように指示しています。私のイテレータクラスは次のようになります。

public java.util.Iterator<T> iterator() {
    return new java.util.Iterator<T>() {
        Node prev= null,curr = head;

        public boolean hasNext() {  
            if (curr != null) {
                return true;
            }
            return false;
        }

        public T next() {
            T temp = curr.data;
            prev = curr;
            curr = curr.next;
            return temp;
        }

        public void remove() {
            if(prev==null || curr==null)
                head=head.next;
            else
                prev.next=curr.next;
        }
    };
}

そして、私が書いたテストは、次のようになります。

public void testiterator(){
    BasicLinkedList<String> basicList = new BasicLinkedList<String>();
    basicList.addToFront("Blue").addToEnd("Red").addToFront("Yellow");
    for(Iterator<String> i = basicList.iterator(); i.hasNext();){
        if(i.next().equals("Blue"))
            i.remove();
    }
    assertTrue(basicList.toString().equals("\" Yellow Red \""));
}

ただし、basicListを印刷すると、リストに黄色と赤ではなく黄色と青が含まれていることがわかります。メソッドを間違って実装しremove()ていますか、間違って使用していますか、またはその両方ですか?

お時間をいただきありがとうございます!

4

3 に答える 3

1

問題は、curr返された最後の要素ではなく、返される次の要素を参照していることです。

remove()あなたの方法は後者を削除するのに対し、前者を削除することを意図しています。

于 2013-03-06T19:34:39.517 に答える
0

現在のノードを次のノードに設定してみませんか。remove メソッドで null をチェックする理由。

于 2013-03-06T19:39:58.753 に答える
0

この仲間を試してください:

public java.util.Iterator<T> iterator() {
    return new java.util.Iterator<T>() {
        Node<T> prev = null;
        Node<T> curr = null;

        public boolean hasNext() {
            if (curr == null) {
                return (head != null);
            }
            return (curr.next != null);
        }

        public T next() {
            if (!hasNext()) {
                return null;
            }
            if (curr == null) {
                curr = head;
            } else {
                prev = curr;
                curr = curr.next;
            }
            return curr.data;
        }

        public void remove() {
            if (curr != null) {
                if (prev != null) {
                    prev.next = curr.next;
                } else {
                    head = curr.next;
                }
            }
        }
    };
}
于 2013-03-06T19:53:33.940 に答える