我试图实现克隆双链表的方法。我试图将其递归,因为这是一项要求。
我认为它克隆正确,但是当我尝试将另一个元素添加到列表末尾时,它会添加到原始队列而不是克隆。
这是我调用方法的主要方法,我做了克隆:
doublelinkedlist<Integer> aux=new doublelinkedlist<Integer>();
doublelinkedlist<Integer> aux2=new doublelinkedlist<Integer>();
aux.addRight(10);
aux.addRight(11);
aux.addRight(9);
aux.addRight(12);
//aux2.addRight(12);
aux2 = (doublelinkedlist<Integer>) aux.clone();
aux2.RemoveRight();
System.out.println("Original Queue: "+aux.toString());
System.out.println("Copy queue: "+aux2.toString());
这是DoubleLinkedList的克隆方法:
public Object clone(){
doublelinkedlist copia = null;
try{
copia = (doublelinkedlist)super.clone();
if (left != null){
copia.left = (node<E>)left.clone();
}
}catch (CloneNotSupportedException e){
return null;
}
return copia;
}
这是节点类的克隆:
public Object clone(){
node<E> copia = null;
try{
copia = (node<E>)(super.clone());
if (next != null){
copia.next = (node<E>)(next.clone());
copia.prev = copia;
}
}catch (CloneNotSupportedException e){
return null;
}
return copia;
}
答案 0 :(得分:0)
您可以使用Collections.copy(dest, src);
克隆列表。
以下是具有递归性的克隆示例
public class ClonableLinkedList extends LinkedList<Double> {
public static void main(String[] args) {
ClonableLinkedList clonable = new ClonableLinkedList();
for (int i = 0; i < 50; i++) {
clonable.add(new Random().nextDouble());
}
LinkedList<Double> cloned = clonable.clone();
for (int i = 0; i < 50; i++) {
System.out.println(String.format("List1 = %f, List2 = %f", clonable.get(i), cloned.get(i)));
}
}
public LinkedList<Double> clone() {
LinkedList<Double> list = new LinkedList<Double>();
return cloneElements(list, 0);
}
private LinkedList<Double> cloneElements(LinkedList<Double> list, int index) {
list.add(this.get(index++));
if (index < this.size()) {
return cloneElements(list, index);
} else {
return list;
}
}
}
答案 1 :(得分:0)
错误如下:
copia = (doublelinkedlist)super.clone();
按照惯例,此方法返回的对象应该是 独立于此对象(正在克隆)。为达到这个 独立性,可能有必要修改一个或多个字段 在返回之前由super.clone返回的对象。
现在是重要的部分:
通常,这个 意味着复制任何包含内部&#34;深度的可变对象 结构&#34;克隆的对象并替换引用 这些对象引用了副本。
[...]
因此,这种方法执行一个浅拷贝&#34;这个对象,而不是 &#34;深拷贝&#34;操作。
你没有深层复制你的对象,你只需要对它们进行新的引用。