如何使用递归克隆双向链表

时间:2014-10-23 16:31:37

标签: java recursion linked-list clone nodes

我试图实现克隆双链表的方法。我试图将其递归,因为这是一项要求。

我认为它克隆正确,但是当我尝试将另一个元素添加到列表末尾时,它会添加到原始队列而不是克隆。

这是我调用方法的主要方法,我做了克隆:

    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;
    }

2 个答案:

答案 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();

来自JavaDocs of Object#clone()

  

按照惯例,此方法返回的对象应该是   独立于此对象(正在克隆)。为达到这个   独立性,可能有必要修改一个或多个字段   在返回之前由super.clone返回的对象。

现在是重要的部分:

  

通常,这个   意味着复制任何包含内部&#34;深度的可变对象   结构&#34;克隆的对象并替换引用   这些对象引用了副本。
  
  [...]
  因此,这种方法执行一个浅拷贝&#34;这个对象,而不是   &#34;深拷贝&#34;操作。

你没有深层复制你的对象,你只需要对它们进行新的引用。