2017-06-19 20 views
-2

我知道java是按值傳遞的。對於鏈表數據結構,方法size()和size1()之間有什麼區別?我認爲,size1()中的頭部和下一個參考點也是一樣的。但結果卻是差別解釋Java中的Linked List數據結構

public class IntList { 
int item; 
IntList next; 

public IntList(int item, IntList next){ 
    this.item = item; 
    this.next = next; 
} 

public int size(){ 
    int size = 1; 
    while (next !=null){ 
     size++; 
     next = next.next; 
    } 
    return size; 
} 

public int size1(){ 
    int size = 1; 
    IntList head = next; 
    while (head != null){ 
     size++; 
     head = head.next; 
    } 
    return size; 
} 
public static void main(String[] args) { 
    IntList L = new IntList(1,null); 
    L = new IntList(2,L); 
    L = new IntList(3,L); 
    L = new IntList(10,L); 
    L = new IntList(20,L); 
    System.out.println(L.size()); 

} 

}

我感到困惑參照裝置在java中。

+0

是結果不同,如果你調用'尺寸1()'第一? – shmosel

+0

是的。 size()將修改L;但size1()不會改變L – jason

回答

1

這是一個範圍問題。在size1()中,你正在創建一個名爲head的局部變量。當您調用size1()時,它會創建一個參考變量,在調用結束時將銷燬。這意味着無論你調用size1()多少次,它總會給你適當的大小。

但是,當您在size()中使用字段「next」時,它會迭代每個變量直到結束。但是,一旦到達那裏,它就不會被破壞,因爲其範圍是對象。這意味着未來你調用大小()的時間,以及所有後續調用(假設沒有變化),它總是返回1

Memory Diagram

+0

是的,我的擔心是「頭」和「下一個」指向相同的參考。 「頭」最終會指向最後一個節點,「下一個」也會指向最後一個節點。 「頭」將被破壞; 「下一個」不會被破壞,但現在它指向最後一個節點。我對嗎?謝謝。 – jason

+0

是的,我只是添加了一個快速圖。希望它有幫助。 –

+0

很明顯。非常感謝。 – jason

1

他們是邏輯上是相同的,但實際上size()指向next到最後的節點,所以接下來大小檢查將返回1 size1()使用一個局部變量來遍歷列表,所以對象的狀態不會受到影響。

+0

聽起來不錯。爲什麼size1()不改變對象狀態。自從頭和下一點指向相同的東西。頭將指向最後的節點。因此,下一個也會指向自head = next以來的最後一個節點嗎?謝謝。 – jason

+0

@jason不,Java中的變量[永遠不會被引用](https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)。兩個變量都指向相同的*對象*,但改變一個*引用*不會影響另一個。 – shmosel

+0

這很有道理非常感謝。 – jason