0

私はJavaが初めてです。質問はそれほど明確ではないかもしれません。コードを使って説明しましょう。以下のコードは、リンクリストに値を出力する関数です。関数の 1 行目では、HeadNode 参照が指すオブジェクトと同じオブジェクトを指す参照を作成します。したがって、currentNode への変更は、HeadNode が指しているオブジェクトに影響します。ここで、while ループ内で currentNode を変更していますが、関数を終了した後、linkedList が変更されていないことがわかります。なんで?

static void PrintLinkedList(ListNode HeadNode)
    {
        ListNode currentNode = HeadNode;
        while(currentNode != null)
        {
            System.out.println(currentNode.getData());
            currentNode = currentNode.getNext();
        }
    }

アップデート:

この質問を持ち出す理由は、リンクリストを逆にする関数を実装したときに、次のコードが実行された後に tempNode が null になるためです。

static ListNode ReverseLinkedList(ListNode headNode)
    {
        ListNode headNodeTemp = headNode;
        headNodeTemp.setNext(null);
        ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
        ListNode currentNode = headNodeTemp;
        while(tempNode != null)
        {...
4

3 に答える 3

2

したがって、currentNode への変更は、HeadNode が指しているオブジェクトに影響します。

いいえ、currentNodeオブジェクトへの参照でHeadNodeもあります。そのオブジェクトを変更することはありません。変更するのはcurrentNode参照するものだけです。

currentNode = currentNode.getNext();

次のオブジェクトをcurrentNode指しますが、オブジェクトは変更されません。

オブジェクトを変更するには、メソッドを呼び出すか、プロパティを設定する必要があります。

currentNode.mutate();
currentNode.property = 17;

はポイント先のオブジェクトを変更し、これらの変更は、 を介してオブジェクトを照会したときに表示されますHeadNode

currentNode = currentNode.getNext();

currentNode別のオブジェクトを指摘するだけです。

static ListNode ReverseLinkedList(ListNode headNode)
{
    ListNode headNodeTemp = headNode;
    headNodeTemp.setNext(null);

ここでは、ポイント先のオブジェクトを変更するメソッドを呼び出します。名前で行くと、nextフィールドをに設定しますnull。そして、オブジェクトheadNodeTempが指しているオブジェクトは、オブジェクトがheadNode指している。

    ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
    ListNode currentNode = headNodeTemp;
    while(tempNode != null)
    {...

あなたは移動する必要があります

ListNode tempNode = headNode.getNext();

ラインより上のsetNext(null)ライン。

static ListNode ReverseLinkedList(ListNode headNode)
{
    ListNode headNodeTemp = headNode;
    ListNode tempNode = headNode.getNext();
    headNodeTemp.setNext(null);
    ListNode currentNode = headNodeTemp;
    while(tempNode != null)
    {...
于 2012-12-11T01:16:25.550 に答える
0

他の投稿に同意します。すべての引数は Java では値渡しです - デモ:

public static void main(String[] args) {

    List a = new ArrayList();
    a.add("Fred");

    changeA(a);
    // contents of a is "Fred" not "Barney" (change to 'a' not reflected back here)
    // because all arguments are Pass-By-Value

    addToA(a);
    // contents of a is "Fred" AND "Barney"

    int b = 10;    

    changeB(b);
    // b = 10 (not 20)
}

static void changeA(List a) {
    a = new ArrayList(); // a is now a different object
    a.add("Barney");
}

static void addToA(List a) {
    a.add("Barney");
}

static void changeB(int b) {
    b = 20;
}
于 2012-12-11T01:37:13.287 に答える
0

オブジェクトと参照を混同しています。

currentNode = xcurrentNode指しているオブジェクトを変更しません。むしろ、別のオブジェクトを指すように currentNode 変数を変更します。

これは、たまたま古いオブジェクトを指している他のフィールドや変数には影響しません。

于 2012-12-11T01:16:33.570 に答える