2016-03-27 35 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++; 
     } 
    } 
} 

這裏是我的節點類:

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

編輯:
我也看其他實現(像一個here);它看起來非常相似。然而,我仍然無法找到爲什麼它沒有分配臨時頭(或head.next)的作品。我相信理論上理解鏈接列表。我只是不明白爲什麼這個位有效。

+2

什麼行「head = temp」?代碼很好,很有意義,儘管它可以顯着減少和重構。 – Bohemian

+0

除了@Bohemian鑑於C++代碼正在爲您的JAVA代碼添加相反的順序值。 –

+0

@Bohemian我試着編輯我的問題。我描述了我的代碼中發生了什麼,以及發生了什麼。希望這能讓我的問題更清楚。 – JustBlossom

回答

1

您的困惑是temp不同head。不是。

他們都是抱着變量引用相同Node對象。通過這兩個變量所做的更改都反映在它們引用的(相同)對象中。當您將Node添加到temp時,將其添加到實際列表中。

+0

謝謝!這很公平,而且大部分都是合理的。但是,這與此有什麼不同:假設我有int x = 5,並且我說int y = x。然後如果x改變,y改變。然而,如果y改變,那並不意味着x改變。所以,對我來說就像是說,Node temp = head,如果head改變,temp改變,但如果temp改變,head不一定會改變。 – JustBlossom

+0

現在我想到了,這個邏輯可能不會成立,因爲我將原始類型與對象進行比較...... – JustBlossom

相關問題