0

カスタム イテレータ/リンク リスト クラスを使用して、最後に反復された要素を削除しようとしています。何らかの理由で、リストの最初の項目 (head 条件) に対してのみこれを行います。条件に問題はありませんか?

If (prev=head) の後の Else の代わりに、If (next != null) を記述して中間ノードを検索し、If (next = null) を記述して最後のノードを検索する必要がありますか? 2 番目の質問: アイテムを削除するには、prev.element = null も記述する必要があります (現在、prev = null しかありません。ノードは消去されますが、そのコンテンツは消去されないと思います。

簡単に言えば、自分で理解できないため、 remove メソッドの何が問題なのですか。どうもありがとうございました。私はこれに何時間も取り組んできましたが、まだ機能していません。

public E next() {
    if (!hasNext())
        throw new NoSuchElementException ();
    prev = next;
    E element = next.element;
    next = next.next;
    return element;
}

public void remove() { 
    if(prev == null) {
        throw new IllegalStateException();
    }
    else {
        if(prev == head){
            head = head.next;
            next = head;
        }
        else {
            next = prev.next;
        }
        sizeOfList--;
        prev = null;
    }
}
4

2 に答える 2

0

while最後のノードに到達するまで、リスト内のすべてのノードを通過できるようにするには、ループが必要です。現状では、コードは単純に先頭を通り過ぎてから、sizeOfList というコードに入り、次に prev = null; というコードに入ります。

次のようなものが必要です。

while (prev.next.next != null) {
    prev = prev.next;
}

prev.next = null;

私は prev.next.next を実行して、リンクされたリストの 2 番目から最後のノードを null 値を指すように設定できるようにします (これは によって行われますprev.next = null;)。次のように考えてください: prev はリストの最後から 2 番目の要素であり、prev.next は最後の要素であり、明らかに prev.next.next は null でなければなりません (prev.next は最後であるため)。この場合、最後から 2 番目の要素を null 値を指すように設定して、最後の要素を削除します。

次に、リストの数を減らします。

于 2013-11-05T07:12:42.583 に答える
0

これは、指定されたコードでの私の最善の推測です

if(prev == head){ if(prev.equals(head)){Use equalsメソッドに変更する必要があります。

そして、対応する要素クラスで equals メソッドをオーバーライドする必要があると思います。

==両方の変数がメモリ内の同じオブジェクトを参照しているかどうかのみをチェックします。等しい場合はObject stateをチェックします。

私はそれが役立つことを願っています:)。

于 2013-11-05T06:38:24.827 に答える