2016-08-10 12 views
2

//私はNode.javaクラスオブジェクトはそのオブジェクト参照なしで更新されていますか?

public class Node{ 

    int data; 
    Node next; 

    public Node(int d) { 
     data = d; 
    } 
} 

//そして、別のJavaクラス

class LinkedList { 

    Node head; 

    public static void main(String[] args) { 
     LinkedList list = new LinkedList(); 
     //Executing this loop 
     for (int i = 0; i < 5; i++) { 

      **list.add(i);** 

     } 
    } 

    void add(int value){ 
     Node newNode = new Node(value); 

     if(head == null)//Very first time its create the head object when i = 0 
     { 
      head = newNode; 
     }else if(head.next == null){//This is for when i value is 1 
      head.next = newNode; 
     }else{ //else part execute i >= 2 
      //Created new node with head.next which mean value 1.And head is 0 
      Node temp = head.next; 
      // Just need this object initialization for reference 
      Node temp1 = newNode; 
      //Checking head.next is null or not if its null skip this loop execution 
      while(temp != null) 
      { 
       temp1 = temp; 
       temp = temp.next; 
      } 
      // Here we set newNode.next to null 
      newNode.next = temp1.next; 
      temp1.next = newNode; 
     } 
    } 
} 

私の質問はここにある、ときtemp1.next持っています= newNode;次の値を に追加しました。

** //たとえば、head = 0の場合、head.next = 1の場合、temp1.next = newNode; head.next.next = 2行がheadで追加されています。私たちが頭のオブジェクト参照を持っていないときはどうなるのでしょうか?

+0

質問の書式を正しく設定してください。 – azurefrog

+0

真剣に:あなたが私たちがあなたを助けてくれることを望みます。質問を適切にフォーマットするために時間を費やしてください。適切なインデント、書式設定など。ご存知のように、質問を作成する際に*プレビュー*があります。 – GhostCat

答えて

1

ヘッドオブジェクトを更新していません。 head.nextオブジェクトを更新しています。

ので

head.next.next 

は次のように書くことができます。

Node nextFromHead = head.next; // nextFromHead is 1 
Node nextFromNextFromHead = nextFromHead.next; // nextFromNextFromHead is 2 

head.next.nextnextFromNextFromHeadと同じオブジェクトですが、それ(2ノード)への直接接続を持っていません。ヘッドノード。

これは、参照がJavaでどのように機能するかを理解するのに役立つと思います。

public class LinkedList { 

    static Node head; 

    public static void main(String[] args) { 

     LinkedList list = new LinkedList(); 
     for(int i = 0; i < 5; i++) 

      list.add(i); 

     Node currentNode = head; // in java we don't need object initialization for reference. Node temp1; would work just fine 

     System.out.println("==head node== " + currentNode); 
     while(currentNode.next != null) { 

      // here we increment 
      currentNode = currentNode.next; 

//   System.out.println("Last time we in here, next is null so print only current"); 
      System.out.println("==next node== " + currentNode); 
     } 
    } 

    void add(int value){ 
     Node newNode = new Node(value); 

     if(head == null)//Very first time its create the head object when i = 0 
     { 
      head = newNode; 
     }else if(head.next == null){//This is for when i value is 1 
      head.next = newNode; 
     }else{ //else part execute i >= 2 
      //Created new node with head.next which mean value 1.And head is 0 
      Node temp = head.next; 
      // Just need this object initialization for reference 
      Node temp1 = newNode; 
      //Checking head.next is null or not if its null skip this loop execution 
      while(temp != null) 
      { 
       temp1 = temp; 
       temp = temp.next; 
      } 
      // Here we set newNode.next to null 
      System.out.println(" ==temp1== " + temp1);// before 
      newNode.next = temp1.next; 
      temp1.next = newNode; 
      System.out.println(" ==temp1== " + temp1);// and after 
     } 

     System.out.println("==current node== " + head); 
     System.out.println(); 
    } 
} 

ノードクラスには、オブジェクトを正しく表示するためのtoString()が追加されています。

public class Node { 

    int data; 
    Node next; 

    public Node(int d) { 
     data = d; 
    } 

    @Override 
    public String toString() { 
     return "Node{" + 
       "data=" + data + 
       ", next=" + next + 
       '}'; 
    } 
} 
+0

しかし、私はここで混乱しています。たとえば、私はMyClassに名前フィールドを持っています。 MyClass object1 =新しいMyClass(); object1.name = "object1"; MyClass object2 = object1;今、object2.name = "object2";したがって、object1.nameを印刷すると、この例では理解が正しいとしたら、 "object1"でなく "object2"になります。 – BoomirajP

+0

私の理解が正しくない場合は、訂正してください。 Thanks – BoomirajP

+0

object1.nameを印刷すると、 "object2"が印刷されます。 object1とobject2の両方が同じオブジェクトを参照しています。 – screab

0

「あなたは」ヘッド要素があります。

あなたのコードを見てください:LinkedListクラスにはフィールドヘッドがあります。あなたのリストのadd()メソッドを呼び出すときはいつでも。そのフィールドはそのメソッドによってアクセス可能です。

ので、このような作品を追加:頭が設定されていない

  1. 場合は、新しいものをヘッドが設定されている場合
  2. 作成されますが、持っているなしは「次」は、その次のノードがあると作成され、頭にリンクされている
  3. 頭が設定され、彼の "次へ"が設定されていれば、次の "次へ"を検索し続けます。次の(まだ)持っていない...

それはすべてが分かります。または、IT以外の例を試してみましょう。

フックとショートロープを仮定します。あなたは "ロープのリスト"を作りたいと思っています。

  1. まだリストはありません。あなたは最初のロープを取ってフックに取り付けます。
  2. 最初のロープ、あなたの頭は、そこにあります。あなたは別のロープを最初のものの終わりに接続することによって(おそらく結び目を作る)
  3. 別のロープを追加する...あなたはフックで始まり、あなたはロープ/緩い終わり。

希望があれば。

+0

はい、あなたのコメントを受け入れてください。それでも私は混乱しました。はい、それは私が次の要素を持っていないと私はtemp1.next = newNode;ここでは、headオブジェクトがその中で次の新しい要素を取得する方法を示します。 – BoomirajP

+0

あなたは何を求めているのか分かりません。私は別の例を試みた。私の更新された答えを見てください。 – GhostCat

関連する問題