2016-01-27 2 views
0

Мне нужно написать программу, которая (реализующую дважды связанный список):Как глубоко клонировать двойной список?

  • Выводит список элементов в списке из передней части списка до конца списка (это мой toArrayFromFirst() метод)
  • печатает список элементов в списке с конца этого к передней части списка (в обратном порядке) (это мой toArrayFromLast() метод)
  • DeepClones список (который является моим deepClone() метода)
  • Распечатывает список предметов в копии списка спереди t до конца списка.

Мои вопросы:

  • Я думаю, что я получаю код для односвязанны Список и двусвязному смешалось в моем deepClone() методе.
  • Моя программа не выводится правильно, и я не уверен, что это потому, что я неправильно вставляю элементы в список или неправильно отображаю список, или если это так.
  • Я получаю эту ошибку: «Исключение в потоке„главный“java.lang.CloneNotSupportedException: dll.dll» (ошибка в этой строке кода: DLL<E> other = (DLL<E>)super.clone(); (в моем deepClone() метод)

Это то, что мой код в настоящее время вывода:

List from first to last: Belgium Germany

List from last to first: England Germany France Belgium

(А потом я получаю ошибку здесь, когда я пытаюсь глубоким клон списка)

Это то, что я хочу, чтобы мой код выхода:

List from first to last: Belgium France USA Germany England

List from last to first: England Germany USA France Belgium

Deep cloned list: Belgium France USA Germany England

Вот мой DoublyLinkedList класс:

package DLL; 

public class DLL<E> 
{ 
    private Node header = null;       //header sentinel 
    private Node trailer = null;      //trailer sentinel 
    private int size = 0;        //number of elements in list 

//nested Node class 
private static class Node<E> 
{ 
    private E element;        //reference to element stored at this node 
    private Node prev;        //reference to previous node in list 
    private Node next;        //reference to subsequent node in list 

    public Node(E e) 
    { 
     element = e; 
    } 
    public E getElement() 
    { 
     return element; 
    }  
    public Node<E> getPrev() 
    { 
     return prev; 
    } 
    public Node<E> getNext() 
    { 
     return next; 
    } 
    public void setPrev(Node<E> p) 
    { 
     prev = p; 
    } 
    public void setNext(Node<E> n) 
    { 
     next = n; 
    } 
    public void displayNode() 
    { 
     System.out.println(element + " "); 
    } 
} 

//returns number of elements in linked list 
public int size() 
{ 
    return size; 
} 

//tests whether linked list is empty 
public boolean isEmpty() 
{ 
    return header == null; 
} 

//adds element e to front of list 
public void addFirst(E e) 
{ 
    Node newNode = new Node(e); 

    if (isEmpty()) 
    { 
     trailer = newNode; 
    } 
    else 
    { 
     size++; 
     header.prev = newNode; 
     newNode.next = header; 
    } 
    header = newNode; 
} 

//adds element e to end of list 
public void addLast(E e) 
{ 
    Node newNode = new Node(e); 

    if (isEmpty()) 
    { 
     header = newNode; 
    } 
    else 
    { 
     size++; 
     trailer.next = newNode; 
     newNode.prev = trailer; 
    } 
    trailer = newNode; 
} 

//removes and returns first element of list 
public Node removeFirst() 
{ 
    Node temp = header; 

    if (header.next == null) 
    { 
     trailer = null; 
    } 
    else 
    { 
     size--; 
     header.next.prev = null;     //null <-- old next 
    } 
    header = header.next; 
    return temp; 
} 

//removes and returns last element of list 
public Node removeLast() 
{ 
    Node temp = trailer; 

    if (header.next == null) 
    { 
     header = null; 
    } 
    else 
    { 
     size--; 
     trailer.prev.next = null;     //old prev --> null 
    } 
    trailer = trailer.prev; 
    return temp; 
} 

//displays array of strings with elements in order from head to tail 
    public void toArrayFromFirst() 
    { 
     System.out.println("List from first to last: "); 
     Node current = header; 

     while (current != null) 
     { 
      current.displayNode(); 
      current = current.next; 
     } 
     System.out.println(""); 
    } 

    //displays array of strings with elements in order from tail to head 
    public void toArrayFromLast() 
    { 
     System.out.println("List from last to first: "); 
     Node current = trailer; 

     while (current != null) 
     { 
      current.displayNode(); 
      current = current.prev; 
     } 
     System.out.println(""); 
    } 

    //displays cloned array with elements in order from head to tail 
      public void clonedToArrayFromFirst() 
      { 
       System.out.println("Deep cloned list: "); 
       Node current = header; 

       while (current != null) 
       { 
        current.displayNode(); 
        current = current.next; 
       } 
       System.out.println(""); 
      } 

    //returns copy of list (deep clone) 
    public DLL<E> deepClone() throws CloneNotSupportedException 
    { 
     DLL other = new DLL<E>(); 

     if (size > 0) 
     { 
      other.header = new Node<>(header.getElement()); 
      Node<E> walk = header.getNext(); 
      Node<E> otherTrailer = other.header; 

      while (walk != null) 
      { 
       Node<E> newest = new Node<>(walk.getElement()); 
       otherTrailer.setNext(newest); 
       otherTrailer = newest; 
       walk = walk.getNext(); 
      } 
     } 
     return other; 
    } 

}

А вот мой главный():

package DLL; 

public class DLLTest 
{ 

    public static void main(String[] args) throws CloneNotSupportedException 
    { 
     DLL myList = new DLL(); 
     DLL clonedList = new DLL(); 

     myList.addFirst("USA"); 
     myList.addLast("Germany"); 
     myList.addFirst("France"); 
     myList.addLast("England"); 
     myList.addFirst("Belgium"); 

     myList.toArrayFromFirst(); 
     myList.toArrayFromLast(); 

     clonedList = myList.deepClone(); 
     clonedList.clonedToArrayFromFirst(); 
    } 
} 
+0

Что вы пробовали? Вы пытались найти сообщение об ошибке в Интернете? –

+0

@MiserableVariable, я не искал сообщение об ошибке конкретно в Интернете.Однако я рассмотрел несколько примеров глубокого клонирования и вывода двусвязных списков, но я все еще не уверен, что не так с моим кодом. – Jaydelay

+0

У вас есть проблема в методе addFirst(). Вы не устанавливаете заголовок в нем. Это должно решить вашу проблему, или большинство из них в любом случае. –

ответ

1

Вы, используя более чем один раз эти две линии вместе в ваших петель:

current = current.getNext(); 
current = current.next; 

Кроме того, вы не обновлять свой размер DLL в любом месте. Таким образом, ваш deepClone даже не входит в ваше состояние if (size > 0).

Наконец, вместо использования super.clone() просто создайте новую DLL и добавьте свои значения.

+0

Большое вам спасибо! Я отредактировал код точно, что вы предложили, и он работает красиво. – Jaydelay

1

Я обнаружил проблему в addFirst(). Вы всегда должны быть установки заголовка:

//adds element e to front of list 
public void addFirst(E e) 
{ 
    Node newNode = new Node(e, null); 

    if (isEmpty()) 
    { 
     trailer = newNode; 
    } 
    else 
    { 
     header.prev = newNode; 
     newNode.next = header; 
    } 
    header = newNode; 
} 
+0

спасибо, что поймал это. Это была неосторожная ошибка с моей стороны. Я обновил код по вашему предложению. Теперь я получаю исключение нулевого указателя в моей строке кода: 'private Node next;' в моем приватном статическом классе Node Jaydelay

Смежные вопросы