2016-07-10 10 views
1

Ich habe an einem Algorithmus gearbeitet, Elemente zu einer verketteten Liste hinzuzufügen, und es zu sortieren, wenn es das Element hinzufügt. Mein Code funktioniert, und ich weiß warum, aber ich war überrascht zu sehen, dass dieser Code zum Hinzufügen von Elementen am Ende der Liste funktioniert hat. Hier ist der Code:Warum funktioniert dieser LinkedList-Sortieralgorithmus?

public void add(int value) 
    { 
    Node currentNode; 
    Node previousNode; 
    Node newNode; 
    if(firstNode == null) 
    { 
     firstNode = new Node(value,firstNode); 
    } 

    else 
    { 
    currentNode = firstNode; 
    previousNode = null; 

    while(currentNode != null && value > currentNode.getValue()) 
    { 
     previousNode = currentNode; 
     currentNode = currentNode.getNextNode(); 
    } 
     if(previousNode == null) 
     { 
     firstNode = new Node(value, firstNode); 
     } 
     else 
     { 
     newNode = new Node(value,currentNode); 
     previousNode.setNextNode(newNode); 
     } 
    } 
    } 

So weiß ich, das zu Beginn für das Hinzufügen funktionieren würde, oder in der Mitte, aber wie es bis zum Ende hinzufügt? Ich meine, wenn die while-Schleife bis zum Ende der Liste durchläuft, dann ist currentNode der letzte Knoten, vorherige Knoten eine zuvor, so würde nicht:

newNode = new Node(value,currentNode); 
previousNode.setNextNode(newNode); 

nie das Element am Ende hinzufügen? Würde es nicht immer den neuen Knoten zwischen dem vorherigen und aktuellen hinzufügen?

+0

currentNode ist null nach der while-Anweisung, wenn es bis zum Ende kommt. –

+2

Funktioniert der Code wirklich, wenn Sie Knoten 23 in eine leere Liste einfügen und Knoten 10 einfügen? Ich sehe nicht, wo der Code die vorherige Listenvorderseite mit dem nächsten Knoten der neuen Listenvorderseite verbindet. Außerdem beschränkt das Design, das die globale Variable 'firstNode' verwendet, Sie auf eine einzige Liste. Ein besseres Design würde arrangieren, um die aktuelle Front-of-the-List an die Funktion (en) zu übergeben und die neue Front-of-the-List zurückzugeben. –

+0

Ja, es funktioniert. Wenn ein Wert niedriger ist als alle Werte in der Liste, dann if (previousNode == null) { firstNode = neuer Knoten (value, firstNode); } heißt natürlich –

Antwort

4

previousNode zeigt, wie der Name schon sagt, auf einen Knoten hinter dem aktuellen Knoten. Wenn Sie das Ende erreicht haben (dies passiert, wenn der Wert, den Sie einfügen möchten, größer ist als jedes der aktuellen Elemente), wird currentNode gleich null, aber previousNode verweist auf den letzten Knoten. Daher funktioniert previousNode.setNextNode (newNode) gut.

+0

ah. Ich dachte, currentNode wäre der letzte Knoten in der Liste, nicht null. Ich denke, null ist der letzte –

Verwandte Themen