2016-10-08 5 views
0

Я пытался сделать глубокую копию связанного списка, известного как DictionaryNode, который я сделал, но я не смог отобразить его содержимое в методе отображения, так как оно всегда равно нулю. почему DictinaryNode temp всегда имеет значение null? и если я попытаюсь назначить temp = head work, но с temp = copy нет.LinkedList Deep copy java

public class ListOfNodes { 

public class DictionaryNode { 
    protected String word; 
    private int level; 
    private DictionaryNode next; 
    private int space = 0; 

    public void displayCopy() { 
     DictionaryNode temp = copy.next; 
     while(temp != null) { 
      System.out.println(temp.word) 
       temp = temp.next; 
     } 
    } 


    public DictionaryNode(String word, int level) { 
     this.word = word; 
     this.level = level; 
     next = null; 
    } 
} 

private DictionaryNode head = null; 
public DictionaryNode copy = null; 

//used to do deep copy 
public void Clone() { 
    DictionaryNode temp = head.next; 

    while(temp != null) { 
     copy = new DictionaryNode(temp.word , temp.level); 
     copy = copy.next; 
     temp = temp.next; 
    } 
} 

public void displayCopy() { 
    DictionaryNode temp = copy.next; 
    while(temp != null) { 
     Sytem.out.println(temp.word) 
      temp = temp.next; 
    } 
} 
+1

Вы никогда не назначаете значение 'head'. Кроме того, я думаю, ваш метод clone должен вернуть ссылку на клонированный словарь. –

+0

Глава инициализируется через чтение пользователем из файла, но проблема в том, что если я попытаюсь назначить временную ссылку главы, она работает и отображает все содержимое, но если я попробую temp = copy не работает – Anny

+0

Если это так, то код, который вы отправили, не является Это то, что ты на самом деле бегаешь. –

ответ

0

В вашем методе Clone вы никогда не назначить next поле для скопированного контента. Вы должны сделать это, чтобы иметь больше, чем один подключенный узел в копии. Кроме того, вам нужно скопировать голову тоже. Кроме того не нужно перезаписать copy ничем, кроме копии головы:

copy = new DictionaryNode(null, head.level); 
DictionaryNode temp = head.next; 
DictionaryNode current = copy; 

while(temp != null) { 
    DictionaryNode nn = new DictionaryNode(temp.word , temp.level); 
    current.next = nn; 
    current = nn; 
    temp = temp.next; 
} 
+0

спасибо, теперь я понял, почему мое следующее значение всегда было null – Anny

+0

, но copy = new DictionaryNode (null, head.level); почему вместо слова вместо этого? – Anny

+0

@ Annny: Разве голова не является элементом перед первым элементом? Я не знаю подробностей вашего списка. Если это не элемент перед первым элементом, а первый элемент, позаботьтесь о том, чтобы избежать «NullPointerException». (и используйте 'head.word' вместо' null') – fabian

0

Эта программа продемонстрирует, как сделать глубокую копию в списке. Это более общий, чем ваш конкретный пример, поэтому, надеюсь, он помогает другим.

public class Java_Practice { 

private static class LinkedListTest { 

    private String data; 
    private LinkedListTest next; 

    public LinkedListTest(String data) { 
     super(); 
     this.data = data; 
    } 

    public String getData() { 
     return data; 
    } 

    public LinkedListTest getNext() { 
     return next; 
    } 

    public void setNext(LinkedListTest next) { 
     this.next = next; 
    } 

    @Override 
    public String toString() { 
     return "LinkedListTest [data=" + data + ", next=" + next + "]"; 
    } 

} 

// Do a deep copy 
private static LinkedListTest copyLlt(LinkedListTest original) { 

    LinkedListTest copy = new LinkedListTest(original.getData() + " copied"); 

    LinkedListTest nextCopy = original.getNext(); 
    LinkedListTest current = copy; 

    while (nextCopy != null) { 

     LinkedListTest newCopy = new LinkedListTest(nextCopy.getData() + " copied"); 
     newCopy.setNext(nextCopy.getNext()); 

     current.setNext(newCopy); 

     current = newCopy; 
     nextCopy = newCopy.getNext(); 
    } 

    return copy; 
} 

public static void main(String[] args) { 

    LinkedListTest firstLlt = new LinkedListTest("First"); 
    LinkedListTest secondLlt = new LinkedListTest("Second"); 
    LinkedListTest thirdLlt = new LinkedListTest("Thrid"); 

    firstLlt.setNext(secondLlt); 
    secondLlt.setNext(thirdLlt); 

    LinkedListTest copiedLlt = copyLlt(firstLlt); 

    // Data should say First, Second, Third 
    System.out.println("Original LinkedListTest: " + firstLlt.toString()); 

    // Data should say First Copied, Second Copied, Third Copied 
    System.out.println("Copied LinkedListTest: " + copiedLlt.toString()); 
} 

}