2016-03-27 8 views
0

私はリンクされたリストの最後にアイテムを追加しようとしています(これは宿題ではなく、自分のためのエクササイズです)。ここでこのLinkedList addLast実装はなぜ機能しますか?

は、プログラムである:ここでは

public class CustomLinkedList { 

    private static Node head = null; 
    private int size = 0; 

    public static void main(String[] args) { 
     CustomLinkedList myList = new CustomLinkedList(); 
     myList.add(5); 
     myList.add(9); 
     myList.add(3); 

     System.out.println("List Size: " + myList.size); 
     myList.print(); 
    } 

    private int size() { 
     return this.size; 
    } 

    private void print() { 
      Node temp = head; 
      for (int i=0; i<=size-1;i++){ 
       System.out.print(temp.value + " "); 
       temp = temp.next; 
      } 
     System.out.println(); 
    } 

    private void add(int value) { 
     if (head == null) { 
      head = new Node(); 
      head.value = value; 
      head.next = null; 
      size++; 
     } else { 
      Node temp = head; 
      while (temp.next != null) { 
       temp = temp.next; 
      } 
      temp.next = new Node(); 
      (temp.next).value = value; 
      size++; 
     } 
    } 
} 

は私のNodeクラスである:ここで

public class Node { 
    public int value; 
    public Node next; 

    public int getValue(){ 
     return this.value; 
    } 
} 

は、私が起こっていると思うものです:
1.私は元/継続的なリストを持っています「頭」で始まる
2.そのリストに追加したい。
3.それに追加するには、その終わりを見つける必要があります。 tempという名前の新しいノードを作成することでこれを行います(これは元のリストの単なるコピーです)。
4.最後に到達するまでコピー(temp)をトラバースします。
5.終了に達すると、新しいノードが作成されます。

私にとって、これは私のコードが停止するところです。さて、私の心の中で、私は、「あなたはあなたの新しいノードを持っています。どこに行く必要があるか分かります。実際のリストを見て追加してください」というコードを追加する必要があります。

しかし、私はそれを持っていません。私のデバッガ(下の画像)によれば、正しいことが起こっていますが、元のリストに新しいノードを追加するという魔法は見られません。これはどのように機能していますか?

enter image description here

編集:私は(1 hereのような)他の実装を見ていた
。それは非常に似て見えた。しかし、私はまだそれがヘッドを(またはhead.next)にtempを割り当てることなく動作する理由を見つけることができませんでした。私は理論上リンクリストを取得すると信じています。私はこのビットがなぜ機能するのか分かりません。

+2

「head = temp」の行は何ですか?このコードは大丈夫ですが、大幅に縮小してリファクタリングすることができます。 – Bohemian

+0

@Bohemianに加えて、C++コードはJavaコードに対して逆の順序で値を追加しています。 –

+0

@Bohemian私は自分の質問を編集しようとしました。私はコード内で起こっていたことと何が起こっているのかを説明しました。うまくいけば、それは私の質問をより明確にします。 – JustBlossom

答えて

1

あなたの混乱は、tempと異なることです。からheadです。そうではありません。

彼らは同じNodeオブジェクトへの参照を保持し、両方の変数です。いずれかの変数を介して行われた変更は、それらが参照する(同じ)オブジェクトに反映されます。 Nodetempに追加する場合は、リストに追加します。

+0

ありがとう!それは公正であり、ほとんどの部分にとって理にかなっています。しかし、これとはどう違うのですか?int x = 5、int y = xと言うとしましょう。 xが変化するとyが変化する。しかし、yが変化すると、xが変化するということではありません。ですから、私の言うところによると、ノードの温度=ヘッド、ヘッドが変化した場合、温度は変化しますが、温度が変化した場合、ヘッドは必ずしも変化しません。 – JustBlossom

+0

私はそれについて考えるので、プリミティブ型をオブジェクトと比較しているので、その論理は成り立たないかもしれません... – JustBlossom

関連する問題