1

基本的なノードリストのコードを理解するのに問題があります。ノード (クラス ListNode) には 3 つの変数が含まれています。文字列「キー」、値「値」、そして別のノード「次へ」。ここまでは順調ですね。ただし、適切な名前の ListMap を持つクラスには、私が理解するのに苦労している put() メソッドがあります。

public void put(String key, int value) {
    ListNode l = search(key, head);
    if ( l==null ) {
        head = new ListNode(key, value, head);
    } else {
        l.value = value;
    }

protected static ListNode search(String key, ListNode l) {
    if (l==null) {
        return null;
    } else if (key.equals(l.key)) {
        return l;
    } else {
        return search(key, l.next);
    }
}

このメソッドは String "key" を検索し、リストにある場合は、その値を 2 番目のパラメーターとして指定された新しい値に置き換えます。
私が理解できないのは、この変数 l です。これは、最初のパラメーターと同じ「キー」または文字列を共有するノードに割り当てられています。
l.value が value に設定されている場合、これがリストに影響するのはなぜですか?
変数 l は、実際のノードではなく、リスト内のノードの 1 つのコピーにすぎませんか?
このような紛らわしい質問を前もってお詫びしますが、どなたかが理解できることを願っています。

4

1 に答える 1

0

変数 l は、実際のノードではなく、リスト内のノードの 1 つのコピーにすぎませんか?

いいえ、ノードへの参照です (C 言語のポインターのようなもの)。同じオブジェクトへの複数の参照を持つことができ、1 つの参照を介してそのオブジェクトに加えられた変更は、もちろん、同じオブジェクトが別の参照を介してアクセスされたときに表示されます。エイリアスのようなものです。

簡単な例を次に示します。

class ListNode {
    int value;
}

ListNode first = new ListNode();
ListNode second = first;
first.value = 42;
System.out.println(second.value);  //42
于 2012-10-24T18:30:04.860 に答える