2013-05-05 21 views
0

首先,我需要一個解釋而不是解決方案。正如您從代碼中看到的,我正在嘗試將MovieNode插入到MovieList中。該方法在MovieList類中。 「列表」是我保留我的MovieNodes的地方。如何在插入後在鏈表中建立連接

public void insert(Movie movie, int index) 
{ 
    MovieNode node = new MovieNode(movie); 
    MovieNode element; 
    MovieNode current = list; 

    while(current.previous != null) 
     current = current.previous; 
    element = current; // first node in the list 

    for(int n = 1; n < index; n++) 
     element = element.next; // determines where to put new node 

    node.next = element; 
    element.previous.next = node; 

} 

上面的方法似乎工作。但是,當我改變這條線

element.previous.next = node; 

與這一個;

element = node; 

插入後鏈接列表沒有變化。在我看來,element.previous.next與元素本身是一樣的,因爲當我們用元素替換元素時,我們也改變了列表中元素之前的節點的後繼。我們將繼任者指向我們的新元素,即節點。我對這個問題很陌生,所以我很抱歉我可能犯的錯誤。

回答

0

elementreferenceMovieNodeelement.previous.next是另一參考相同MovieNode。這兩者之間的區別在於element是您的函數範圍內的臨時引用;然而,element.previous.next是在此範圍之外定義的element.previous節點所持有的參考。

重要的是要記住,在Java中說a = b是非常重要的,其中ab是對象,意味着ab指向同一個對象。如果修改a,則b也將更改。

這就是爲什麼您在函數的開頭複製了MovieNode:爲了有效地複製節點而不是引用它。其餘的情節只是操縱previousnext引用,並不處理實際的對象。

+0

感謝您的解釋。現在我更瞭解它。 – Riemann 2013-05-05 20:24:26

+0

不客氣。我剛讀了你對歐根的回答的評論。你是對的,你只在正向連接節點。這是雙向鏈接的雙向鏈表,通常與這種類型的列表你應該保持對兩端的引用。 – Anthony 2013-05-05 20:42:47

+0

再次感謝。根據你的回答,我只寫了刪除方法,它工作得很好。我實際上不明白在Java中的引用,直到我看到你的解釋:)。 – Riemann 2013-05-05 20:49:43

1

是有區別的:

element.previous.next = node; 

將使先前的元素下一字段指向節點,即,它會改變以前元件。

element = node; 

將只與分配(新)節點的局部變量元素 - 所以它是接近於無操作。

+0

感謝您的快速回復。我剛剛意識到我還必須添加「node.previous = element.previous;」行到我的代碼。我的意思是,當我將元素前面的節點連接到新節點時,我還必須進行反向連接。在我看過要學習這個主題的視頻中,他們只是說當你向鏈表插入一個新節點時,你必須首先將這個新節點的後繼者指向給定插入索引處的節點,然後用新的一個。無論如何要以更簡單的方式進行插入操作? – Riemann 2013-05-05 20:07:22