2017-05-12 9 views
1

Ich habe den folgenden Code in Main.java versucht, verkettete Liste aus einem Buch zu implementieren. Es ist eine sehr grundlegende Frage, macht mich aber verrückt. Würde mich freuen Hilfe!Schleife in einer verknüpften Liste

class Node { 

    Node next = null; 
    int data; 

    public Node (int d) { 
     data = d; 
    } 

    void appendToTail (int d) { 
     Node tailNode = new Node (d); 
     Node currentNode = this; 
     while (currentNode.next != null) { 
      currentNode = currentNode.next; 
     } 
     currentNode.next = tailNode; 
    } 
} 

class Main { 
    public static void main (String args[]) { 
       Node n = new Node(10); 
       n.appendToTail (11); 
       n.appendToTail (12); 
       n.appendToTail (13); 
     } 
} 

Also, auf n.appendToTail (13); die folgende Schleife wird zweimal ausgeführt: while (currentNode.next! = Null) {... und on n.appendToTail (14); die gleiche Schleife läuft dreimal usw. Warum? Ich verstehe nicht.

Ich verstehe auch nicht den Zweck dieser Schleife - warum ist currentNode.next immer null?

Jede Ausbildung würde geschätzt werden.

Vielen Dank.

+2

Wegen 'currentNode.next = tailNode;'. Deine Schleife gehe zum Ende der Liste und füge deinen neuen Knoten 'TailNode' als' next' von currentTail hinzu. Bedeutung bei jedem Aufruf, es wird bis zum Ende iterieren und einen neuen Knoten hinzufügen – AxelH

Antwort

0

n ist an der Spitze der Liste zeigt (Node(10)). Jedes Mal, wenn Sie einen Knoten zur Liste hinzufügen, indem Sie n.appendToTail() aufrufen, wird die while-Schleife am Anfang beginnen und für jeden Knoten in der Liste einmal durchlaufen, bis das Ende erreicht ist.

Wenn Sie es das erste Mal aufrufen, wird keine Schleife ausgeführt, da die Bedingung für die while-Schleife falsch ist. Da es nur einen Knoten in der Liste gibt, befindet er sich bereits am Ende der Liste (currentNode.next == null). Beim zweiten Mal wird es einmal ausgeführt, da es jetzt zwei Einträge in der Liste gibt: Die erste Schleife führt sie von nach , und dann findet sie eine Null, die die Schleife verlässt.

Zum dritten n.appendToTail(), schleift es einmal von Node(10) zu Node(11) zu bewegen, und dann ein zweites Mal von Node(11) zu Node(12) zu bewegen. Nur dann ist es am Ende der Liste und verlässt die Schleife.

+0

Sieht aus wie ich currentNode.next nicht verstehe (Mangel an OO Wissen): Warum enthält das mehrere (Referenzen) Objekte? Ich bin sicher, es ist einfach, es ist nur ich kann es nicht verstehen und das Buch, das ich verwende, zeigt das nicht alles. Würde mich freuen Hilfe !! – Vahe

+0

'currentNode.next' enthält keine Mehrfachverweise, sondern nur einen Verweis auf den nächsten Knoten in der Liste. Es ist dieser Knoten wiederum, der einen Verweis auf ein anderes Objekt hat. Jeder Knoten in der Liste hat einen solchen Verweis, mit Ausnahme des Endwerts, der für diesen Wert eine Null aufweist, da sich kein Knoten dahinter befindet. Dies ist die Idee hinter einer verketteten Liste: Es ist eine Kette von Objekten mit jeweils einem Verweis auf das nächste, und nicht ein Objekt (der Kopf der Liste), das auf alle anderen Elemente zeigt. – Zak

+0

Danke. Was ist mit [Node n = this;] - bezieht sich dies immer auf den ursprünglichen (ersten) Node? Entschuldigung, es muss eine grundlegende OO-Frage sein, aber ich komme aus einer Scripting-Welt. – Vahe

1

einfach beacuse currentNode.next = tailNode; wird die neue Node an den Schwanz verbindet

> : represent a .next link

Node1 > Node2 > Node3 

appendToTail(4) aufrufen, wird die Schleife gab currentNode die Referenz von Node3 (kein > noch) und setzen dann den neuen Knoten zu diesem currentNode.next

Node1 > Node2 > Node3 > Node4 

Aufruf appendToTail(5), gleiche Idee wird currentNodeNode4 haben, weil der kein next Wert

Node1 > Node2 > Node3 > Node4 > Node5 

Die Schleife ist hier nur das Ende zu finden (durch das Fehlen eines next Wert dargestellt)

0

Der Referenz n zeigt immer auf den ersten Knoten. Wenn Sie das tun

Bei jedem Funktionsaufruf zeigt currentNode auf den ersten Knoten. So wenn Sie

tun
n.appendToTail (11); 

keine Schleife ausgeführt werden, da es nur einen Knoten. Wenn Sie das tun

n.appendToTail (13); 

gibt es bereits drei Knoten, so wird es Schleife zweimal

Verwandte Themen