0

クラス「ListNode」のオブジェクトを使用したリンクリストがあります

ListNode には、次の非静的メソッドがあります。

getValue()
setValue(Object obj)
getNext()
setNext(ListNode ln)

そのコンストラクターは、値と次のものを取ります。

ドライバー クラスのメイン メソッドで、リンク リストを作成します。

ListNode head = new ListNode("Overflow!", null);
head = new ListNode("Stack", head);
head = new ListNode("in", head);
head = new ListNode("is", head);
head = new ListNode("This", head);

というメソッドがありprintList(ListNode ln)ます。

次のように、メイン メソッドで 2 回連続して呼び出します。

printList(head);
System.out.println();
printList(head);

私の方法は次のようになります。

public static void printList(ListNode head)
{
    while(head != null)
    {
        System.out.print(head.getValue()+" ");
        head = head.getNext();
    }
}

私の方法では、参照は while ループで毎回異なるオブジェクトを指すように変更されます。メソッドを終了した後、参照 "head" は null を指しているはずですよね? しかし、printList(head) が 2 回目に呼び出されると、魔法のようにリスト内のすべての要素が出力されます。

jGrasp コンソールに表示される内容は次のとおりです。

 ----jGRASP exec: java StackOverflowQuestionExampleClass

This is in Stack Overflow! 
This is in Stack Overflow! 
 ----jGRASP: operation complete.

以下は、先生が使用するように私に言った listnode クラスです。

//Thomas Bettge, TJHSST, 10-20-2006
    public class ListNode
   {
      private Object value;
      private ListNode next;
       public ListNode(Object v, ListNode n)
      {
         value=v;
         next=n;
      }
       public Object getValue()
      {
         return value;
      }
       public ListNode getNext()
      {
         return next;
      }
       public void setValue(Object newv)
      {
         value=newv;
      }
       public void setNext(ListNode newn)
      {
         next=newn;
      }
   }
4

2 に答える 2

1

混乱はおそらく、同じ名前の "head" を持つ 2 つのラベルがあるという事実から生じています。printList メソッドの「head」引数は、渡されたオブジェクトへの新しい参照です。それを再割り当てしても、元の参照のターゲットには影響しません (他の何かを参照することはないという意味で)。余談ですが、参照されているオブジェクトは同じオブジェクトであるため、参照されているオブジェクトの状態を変更すると影響があります)。

次のようにコードを見ると、より明確になる場合があります。

public void yourMainMethod() {
    ListNode head = new ListNode("Overflow!", null);
    head = new ListNode("Stack", head);
    head = new ListNode("in", head);
    head = new ListNode("is", head);
    head = new ListNode("This", head);

    printList(head);
    System.out.println();
    printList(head);
}

//note different name, to clarify this is a separate reference
public static void printList(ListNode node) {
    while(node != null)
    {
        System.out.print(node.getValue()+" ");
        node = node.getNext();

        //node.setValue(new Object());//note that this would change the state inside the ListNode passed in
    }
}
于 2012-11-04T01:24:31.030 に答える
1

headメソッド print 内のローカル参照です。headそれに再割り当てしても、メソッド外の参照には影響しません。

于 2012-11-03T23:14:44.103 に答える