私は、リンクリストに要素を追加し、要素を追加するときにソートするアルゴリズムに取り組んできました。私のコードは機能していますが、その理由の大部分はわかっていますが、このコードがリストの最後に要素を追加するのに役立つのを見て驚いています。コードは次のとおりです:このLinkedListソートアルゴリズムはなぜ機能しますか?
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);
}
}
}
私はこれが最初または中間に追加することはできますが、最後にどのように追加するのでしょうか?私が意味するwhileループは、リストの最後に横断場合、その後、現ノードが前のノードが前のもので、最後のノードであり、そうではないでしょう:
newNode = new Node(value,currentNode);
previousNode.setNextNode(newNode);
最後に要素を追加したことがありませんか?以前のノードと現在のノードの間に新しいノードを追加するのではないでしょうか?
while文の後にcurrentNodeがnullになります。 –
ノード23を空のリストに挿入してノード10を挿入すると、コードは実際に動作しますか?私はコードが以前のフロント・オブ・ザ・リストを新しいフロント・オブ・ザ・リストの次のノードに引っ掛けているところを見ていません。また、グローバル変数 'firstNode'を使用したデザインは、本質的にあなたを単一のリストに制限します。より良いデザインは、現在の関数のリストを関数に渡し、新しい関数のリストを返すように調整します。 –
はい、動作します。値がリスト内のいずれか小さい場合は、(previousNode == null) { firstNode = new Node(value、firstNode); }は、もちろん –