我有一个类Stack,我在其中声明了一个Node,我需要覆盖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;
}
我有其他功能,如push()和pop(),所以你可以假设它们工作正常。
问题在于,我想要做的是能够创建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());
}
}
如何分开此链接?
谢谢
答案 0 :(得分:0)
克隆时,不仅需要创建新的Stack对象,还需要为每个元素创建一个新的Node对象。我不确定这是不是你做的,因为代码片段没有显示它。你的代码中可能只有一个拼写错误。将clone()声明为static temporary并将Stack作为参数传递,以查看代码是否合理。
如果您厌倦了克隆复杂的数据结构,那么另一个更方便的选项 - 使用普通的Java序列化序列化为字节数组,然后反序列化为新的堆栈。这被称为深度克隆。 例如,请参见this link