2014-10-23 2 views
0

Im пытается реализовать метод, который клонирует двойной связанный список. Я пытаюсь сделать это рекурсивно, поскольку это требование.Как клонировать двойной связанный список с использованием рекурсивности

Я думаю, что он клонирует вправо, но когда я пытаюсь добавить еще один элемент в конец списка, он добавляется в исходную очередь, а не в клонированную.

это главное, где я вызывать методы и я клон:

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

Я должен реализовать метод clone, если бы я сделал это, но спасибо в любом случае – Jordi

+0

@Jordi Я отредактировал с помощью метода рекурсивного клонирования –

0

Ошибка в следующей строке:

copia = (doublelinkedlist)super.clone(); 

От JavaDocs of Object#clone()

По соглашению, объект, возвращаемый этот метод должен не зависит от этого объекта (который клонируется). Для достижения этой независимости может потребоваться изменить одно или несколько полей объекта , возвращенного super.clone перед его возвратом.

Теперь наступает важная часть:

Как правило, это означает копирование любых изменяемых объектов, которые содержат внутреннюю «глубокую структуру» объекта клонированы и заменяя ссылки на этих объекты со ссылками на копии.

[...]
Таким образом, этот метод выполняет «неполную копию» этот объект, а не «глубокая копия» операции.

Вы не глубоко копируете свои объекты, вы получаете только новую ссылку на них.

+0

Я действительно не понимаю, в моем случае, что я должен писать, чтобы сделать глубокую копию? – Jordi