2016-10-08 5 views
0

Ich habe versucht, die tiefe Kopie meiner verknüpften Liste, bekannt als DictionaryNode, die ich tat, aber ich war nicht in der Lage, seinen Inhalt in der Anzeige-Methode anzuzeigen, da es immer null ist. Warum ist DictionaryNode temp immer null? und wenn ich versuche, Temp = Kopf Arbeit zuweisen, aber mit Temp = Kopie nicht.LinkedList Deep Kopie 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

Sie vergeben niemals einen Wert für "Kopf". Außerdem denke ich, dass Ihre Klonmethode einen Verweis auf das geklonte Wörterbuch zurückgeben sollte. –

+0

Kopf wird über den Benutzer aus Datei lesen initialisiert, aber Problem ist, wenn ich versuche, Temp-Referenz des Kopfes zuweisen funktioniert und zeige mir den gesamten Inhalt, aber wenn ich versuche, temp = Kopie funktioniert nicht – Anny

+0

Wenn ja, dann den Code Sie gebucht isn Was du eigentlich rennst. –

Antwort

0

In Ihrer Clone Methode, die Sie nie ein next Feld für den kopierten Inhalt zuweisen. Sie müssen dies tun, um mehr als einen einzelnen verbundenen Knoten in der Kopie zu haben. Außerdem müssen Sie den Kopf kopieren. Außerdem nicht copy mit etwas anderem als die Kopie des Kopfes überschreiben muss:

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

danke jetzt habe ich, warum mein nächster Wert war immer Null – Anny

+0

aber copy = new DictionaryNode (null, head.level); Warum null statt Wort? – Anny

+0

@Anny: Ist der Kopf nicht nur ein Element vor dem ersten Element? Ich kenne die Details Ihrer Liste nicht. Wenn dies nicht das Element vor dem ersten Element, sondern das erste Element selbst ist, sollten Sie darauf achten, eine 'NullPointerException' zu vermeiden. (und benutze 'head.word' anstelle von' null') – fabian

0

Dieses Programm wird zeigen, wie auf einer Liste eine tiefe Kopie zu tun. Es ist generischer als Ihr konkretes Beispiel, hoffentlich hilft es auch anderen.

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

}