2

LUT のリンク リスト実装から特定のキーを持つノードを削除するメソッドを作成しようとしています。

私が書いたコードの要約:

public void delete (String k) {

    Node currNode = listHead;
    Node prevNode = listHead;

    Key key = new Key (k);

    while (!currNode.key.equals(k) && currNode != null){
        prevNode = currNode;
        currNode = currNode.next;
    }

    if (currNode == listHead) {
      listHead = listHead.next;
    } else {
      prevNode.next = currNode.next;
    }
}

私の友人は本質的に同じことを書きましたが、以前のノードポインタを使用せず、代わりに彼の最後の行として書きました:

currNode = currNode.next //detach point, override

これらはどちらも同等ですか?Javaメモリ管理について混乱していると思います。
ノードを別の場所にすでに作成している場合listHead、次のように記述します。

Node currNode = listHead;

currNodeが保存されているメモリの場所への参照のみを保存していますlistHeadよね?そのため、while ループで でcurrNode = currNode.next参照currNodeされているメモリ ロケーションに移動し、次に変数を見て、そのメモリ ロケーションへの参照をcurrNode?に格納しています。したがって、基本的にどこcurrNodeを指しているかを更新します。これは私の友人のコードが間違っていたことを意味しますよね? 彼のコードは同様に「currNodeのメモリ位置で現在の参照を更新する」ことを意味するためcurrNode.nextです。

誰か霧を取り除くのを手伝ってくれませんか?

4

3 に答える 3

3

リストからaを削除するには、a の.nextフィールドを変更する必要があるため、あなたの友人は正しくありません。NodeNode

ご存じのとおり、リストから node を削除するには、 node のフィールドを nodeを参照するようにN設定する必要があります。ノードのフィールドを変更していないため、友人のアプローチはおそらくそれを行うことはできません。.nextN-1N+1.next

メモリに関しては、N-1.nextフィールドが を参照するとN+1Nリストによって保持されなくなります。ガベージ コレクションの対象となるかどうかは、プログラム内の他の何かがそれを参照しているかどうかによって異なります。しかし、リストは今やその手を洗い流しました。

于 2012-05-15T21:27:25.570 に答える
2

クエリに対する正しい回答は既に得られていますが、コードにコメントに収まらないバグがいくつかあります。

NullPointerException

あなたのwhileループ条件は逆です。そのはず

while (currNode != null && !currNode.key.equals(k)) { ... }

NullPointerExceptionリストの最後に到達したとき、またはリストに開始するノードがない場合にa を回避します。

値が見つかりません

kこのメソッドは、リストに含まれていない場合を処理しません。while ループcurrNodeの後に確認する必要があります。null

if (currNode != null) {
    if (currNode == listHead)
        listHead = listHead.next;
    else
        prevNode.next = currNode.next;
}
于 2012-05-15T21:50:17.817 に答える
1

あなたの分析は正しいです。あなたの友人のコードは、実際にはリストからノードを削除しません。

デバッガーを使用してコードをステップ実行すると、霧が晴れるのに役立つと思います。統合開発環境 (IDE) をまだ使用していない場合は、IntelliJ IDEA、Eclipse、または Netbeans をお勧めします。これらにはすべてデバッガーが含まれています。

于 2012-05-15T21:30:28.207 に答える