2013-06-19 150 views
1

我試圖編寫一個方法來刪除鏈接列表中的最後一個節點(用於學習如何修改鏈接列表..我沒有使用java庫LinkedList類)..我試圖處理與傳遞的鏈表只有一個節點的用例。使用java刪除鏈接列表中的節點

但是,當我嘗試在刪除前後打印鏈接列表時,它會提供相同的輸出,就像節點未被刪除一樣。

class NodeProcessing{ 
    public static void removeLastNode(Node f){ 
     if (f==null) return; 
     if(f.next == null){//if linkedlist has single node 
      f = null; 
      return; 
     } 
     ... 
    } 

    public static void showList(Node first){ 
     System.out.println("linked list="); 
     for(Node x = first; x != null; x = x.next){ 
      System.out.print(x.item+" ,"); 
     } 
     System.out.println(); 
    } 

    public static void main(String[] args) { 
     Node a = new Node(); 
     a.item = "one"; 
     showList(a); 
     removeLastNode(a); 
     showList(a); 
    } 

} 
class Node{ 
    String item; 
    Node next; 
} 

輸出:

鏈表= 一個,

鏈表= 一個,

更新: 當我使用的調試器,我可以看到Node amain()有地址:[email protected]Node f裏面的removeLastNode()也有: [email protected]

+0

您會發現,在您參考或按價值思考後,這是一個常見問題。當您在方法「removeLastNode」中設置節點空值時,它只是將複製引用「f」設置爲空,實際節點「a」總是指向實際值。順便說一下,您可以更改Node.item在你的Method.You可能會發現一些堆和堆棧的細節來尋找答案。 – Sstx

回答

6

f設置爲null什麼都不做 - 這只是改變了參數的值,這只是一個局部變量。理解Java總是爲參數使用傳值是很重要的 - 當參數類型是類類型時,該值是引用,但該引用是按值傳遞的。將參數值更改爲不同的引用不會更改調用方的參數。

理想情況下,您希望將「列表」的概念與「列表中的某個節點」分開(就像Java API一樣)。通過這種方式,當您在列表上調用remove時,它會將列表本身變爲。在當前的「節點僅僅是列表的頭部」模型中,您無法刪除最終節點 - 您無法銷燬節點本身。

你能來是使removeLastNode一個Node參考最近的 - 這可能返回null如果名義名單現在是空的。

+0

除了Jon的回答之外,建議您在刪除節點後將已刪除的元素設置爲null。這將有助於避免內存泄漏。 – Atul

1

節點F是在下述方法

public static void removeLastNode(Node f) 

局部變量既然是參照實際參數的副本,對參數進行的更改不會影響的參數。

你正在做

f = null 

其中作爲

Node first 

將仍然指向現有節點。 您正在使用參數來打印鏈接列表,因此結果。

0

您可以使用java提供的LinkedList數據結構來執行此操作。

LinkedList items = new LinkedList(); 
    items.add("one"); 
    items.add("two"); 

    System.out.println(items); 
    items.removeLast(); 
    System.out.println(items); 

這將生成所需的輸出。

+0

我想學習如何編寫/從頭開始編輯鏈表..所以我有意識地避免java的LinkedList – damon

+0

我應該刪除這個答案嗎? –

+0

實際上,我曾嘗試過這樣,當我不知道java中的鏈表時,所以認爲你可能遇到過類似的問題 –