2014-02-13 67 views
0

我哈瓦一個Stack類中,我有一個節點在它宣告,我需要重寫clone()函數:重寫在Java中的clone()函數

public class Stack<T> { 
    public class Node<T> { 
     T element; 
     Node<T> next; 

     public Node(T data, Node<T> n) { 
      element = data; 
      next = n; 
     } 

     @Override 
     public Stack<T> clone() { 
      Stack<T> temp = new Stack<T>(); 
      Node<T> n; 
      n = top; 
      if(n != null) { 
       temp.push(n.element); 
       while(n.next!=null) { 
        n = n.next; 
        temp.push(n.element); 
       } 
      } 
      Stack<T> temp2 = new Stack<T>(); 
      while(!temp.isEmpty()) { 
       temp2.push(temp.pop()); 
      } 
      return temp2; 
    } 

我還有其他的功能,如推( )和pop(),所以你可以假設它們工作正常。

的問題是什麼即時試圖做的是要能夠創建2個不同的堆棧對象,在其中一人推一些值,然後將其克隆到2之一。

我的代碼,這是可能的,但是當我試圖推值成克隆棧,它會自動將值代入第一組了。

這是我推

public void push(T el) throws MyException { 
    Node<T> random = null; 
    Node<T> newN = new Node<T>(el, random); 

    if(isEmpty()) { 
     top=newN; 
     newN.next = null; 
    } else { 
     newN.next = top; 
     Node<T> temp; 
     temp = top; 
     top = newN; 
     while(temp.next!=null) 
      temp = temp.next; 
     temp.next=null; 
    } 
} 

這是我怎麼能分開這個鏈接,我的主要功能

public class Tester 
{ 
    public static void main(String []args) 
{ 
Stack<Integer> test = new Stack<Integer>(); 
test.push(1); 
test.push(3); 
System.out.println(test.toString()); 

Stack<Integer> test2 = new Stack<Integer>(); 
test2 = test.clone(); 
test2.push(4); 

System.out.println(test2.toString()); 
System.out.println(test.toString()); 
} 
} 

的代碼?

謝謝

+3

看來你'的clone()'沒有'return'聲明。這不會編譯。 – Haozhun

+1

顯示'push()'方法的代碼可能有助於提示答案。 –

+0

@Haozhun很抱歉,我錯過了我的代碼的一部分......現在它完全 – beckinho

回答

0

當克隆,不僅需要創建一個新Stack對象,你還需要爲每個元素創建一個新的Node對象。我不確定這是否是你所做的,因爲代碼段沒有顯示它。你可能在你的代碼中有一個錯字。將clone()聲明爲靜態臨時並將Stack作爲參數傳遞,以查看代碼是否正確。

,如果你生病了克隆複雜的數據結構的另一個更方便的選擇 - 序列化爲字節數組,使用普通的香草Java序列化,然後反序列化到一個新的堆棧。這就是所謂的深度克隆。 見this link例如