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?
currentNode ist null nach der while-Anweisung, wenn es bis zum Ende kommt. –
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. –
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 –