2011-01-13 55 views
0

我有一個線性鏈表由節點組成:深線性的副本鏈表

class Node{ 
    Object data; 
    Node link; 

    public Node(Object pData, Node pLink){ 
     this.data = pData; 
     this.link = pLink; 
    } 

    public String toString(){ 
     if(this.link != null){ 
      return this.data.toString() + this.link.toString(); 
     }else{ 
      return this.data.toString() ; 
     } 
    } 

    public void inc(){ 
     this.data = new Integer((Integer)this.data + 1); 
    } 

    public Node copy(){ 
     return new Node(this.data, this.link.copy()); 
    } 
} 

我想打表的深層副本。然後增加原始列表的每個節點並同時打印。我不知道代碼是否正確。

class Aufg1{ 
    public static void main(String args[]){ 
     Node node3 = new Node(new Integer(3), null);    
     Node node2 = new Node(new Integer(2), node3);   
     Node node1 = new Node(new Integer(1), node2); 
     System.out.println(node1.copy().toString()); 
     System.out.println(node1.toString()); 
    } 
} 

...給我第二個println只有123,但副本有些問題。有任何想法嗎?

更新:

public Node copy(){ 
     if(this.link != null){ 
      return new Node(new Integer((Integer)this.data), this.link.copy()); 
     }else{ 
      return new Node(new Integer((Integer)this.data), null); 
     } 
    } 
+1

即使您正在進行深度複製,也不要創建Integer的副本。即使是深層複製也不需要複製不可變對象,因爲它們本質上可以安全共享。另外,如果你知道並依賴'data'是一個Integer,爲什麼不把它聲明爲這樣呢? – 2011-01-13 22:20:02

+0

謝謝,我改變那個整數東西 – 2011-01-13 22:25:20

回答

3

深拷貝意味着您還需要做一份數據拷貝。

public Node copy(){ 
    return new Node(copy of this.data, this.link.copy()); 
} 

因此,您需要決定如何複製對象。

編輯:你可以使用像Deep Cloning Library這樣的幫助。它們使用反射等。如果您知道自己創建對象類的對象類型,則可以創建一個複製構造函數。

1

好了,從一個事實,即鏈路可以是空判斷,你可能希望避免調用this.link.copy()沒有檢查。我猜你正在談論的問題是空指針異常。

編輯:

是的,什麼文森特說。 :)

一定要複製對象。