2017-10-18 3 views
-1

Ich schreibe eine Einfügemethode für eine verkettete Liste und fand eine Sache schwer zu verstehen. Es funktioniert, wenn mit diesem Code durchlaufen:Traversing durch eine verkettete Liste in Java

class Node { 
int data; 
Node next; 
Node(int d) { 
     data = d; 
     next = null; 
    } 
} 

public static Node insert(Node head,int data) { 
    Node conductor = head; 
    if(conductor == null){ 
     head = new Node(data); 
    } 
    else{ 
     while(conductor.next != null){ 
      conductor = conductor.next; 
     } 
     conductor.next = new Node(data); 
    } 
    return head; 
} 

aber wenn ich die while-Schleife zu ändern:

 while(conductor != null){ 
      conductor = conductor.next; 
     } 
     conductor = new Node(data); 

Es funktioniert nicht. Und ich verstehe nicht, was der Unterschied ist. Kann mir bitte jemand helfen?

+1

Im ersten gefunden, nach dem 'while',' conductor' die letzten Element in der Liste. In der zweiten ist "Dirigent" "null" und nicht Teil der Liste. –

+2

Lassen Sie mich das klarstellen: Sie haben den Code in etwas anderes geändert, und dann fragen Sie sich, warum es anders ist? Warum nimmst du nicht ein Beispiel für eine kurze Liste und arbeitest auf Verlierer, was es tut? –

+0

Ich sehe! Ich habe null falsch verstanden. Ich dachte, dass der Nullpunkt, auf den der letzte Knoten zeigt, eine Referenz hat, so dass, solange der Leiter auf diese Null zeigt, er Teil der Liste sein wird.Jetzt weiß ich, dass null null ist, es enthält keine Referenz. Vielen Dank! –

Antwort

0

Wenn erste Schleife der conductor stoppt enthält einen Verweis auf den letzten Knoten in der Liste, das heißt es ist derjenige, das next null ist. Es ist dieser Knoten, den Sie ändern möchten, was Sie mit Ihrem conductor.next = new Node(data) tun können.

Mit der zweiten Schleife stoppt es, wenn conductornull ist, die völlig nutzlos ist und mit ziemlicher Sicherheit nicht das, was Sie wollen.

+0

Vielen Dank, ich bekomme es jetzt! –

0

Das Problem ist, dass, wenn Sie über die Elemente durchlaufen, bis ein null getroffen werden Sie conductor ein neues Node zu sein, die keine connnection auf den Rest der Liste haben:

[node0] -> [node1] -> `null` ... [node2] -> null 
            ^^^-- your inserted element 

Was Sie wollen, Stattdessen finden Sie das letzte Element und fügen Sie Ihre neue Node als next Ihres letzten Elements. Deshalb wird es eine verknüpfte Liste genannt. Wenn Sie insert erstellen Sie eine Link aus dem letzten Element zum nächsten:

[node0] -> [node1] -> [node2] -> null 
         ^^^-- your inserted element 
+0

Das ist sehr klar! Vielen Dank. –

-1

Sie müssen verstehen, dass eine lokale Variable Node conductor, ein Referenz auf ein Objekt, nicht das Objekt selbst, weder eine Kopie davon.

So am Ende der Schleife conductor = new Node(data); macht gerade diese Referenz Punkte zu einem brandneuen Objekt. Es ändert nicht die Liste selbst.

+0

Ja, ich verstehe. Vielen Dank. –

0

Lassen Sie sagen, die verknüpfte Liste

1-> 2-> 3-> 5-> null

die Schleife Sie stoppt geschrieben haben, wenn sie den Null-Zeiger erreicht und erzeugt einen neuen Knoten aber nicht auf Aktuelle Next's, die die Verbindung zwischen "5" und dem neuen Knoten, den Sie erstellen, unterbrechen, so dass kein neuer Knoten an die verknüpfte Liste angehängt wird.

so müssen wir die Schleife stoppen, wenn wir Strom nächsten ist null, und wir haben hinzuzufügen, um den neuen Knoten in der aktuellen nächsten Position