ノードからのデータをスワップしてソートする二重リンクリストのJavaでの挿入ソートについて、次のルーチンを作成しました。これは正常に機能します。しかし、私は挿入ソートを実現するために実際にノードリンクを交換する方法を理解しようとしています。多くのオプションを試しましたが、ノードが参照しているオブジェクト参照であるため、それらを変更するとリストが台無しになり、すべてが失敗します。任意のポインタをいただければ幸いです。
ノードクラス(内部クラス):
private class Node {
T data;
Node next;
Node prev;
}
ソートルーチン
public void sort() {
if(isEmpty()) {
throw new RuntimeException("List is empty");
}
Node current = head;
while(current != null) {
for(Node prev=current; prev.prev != null; prev = prev.prev) {
if(prev.data.compareTo(prev.prev.data) <= 0) {
T tmp = prev.data;
prev.data = prev.prev.data;
prev.prev.data = tmp;
}
}
current = current.next;
}
}
編集1:
ノードを交換する方法を提供してくれたlhuangに感謝します。できます。実際の答えは、Javaがオブジェクトではなく値で参照をコピーして渡すという事実にあります(http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.htmlを参照)。したがって、同じ場所で試行するのではなく、ノードスワッピングを他の方法に渡す必要があります。したがって、スワッピングされる2つのノード以外の残りのノードには影響しません。
ルーチンを次のように変更しました
public void sort() {
if(isEmpty()) {
throw new RuntimeException("List is empty");
}
Node current = top;
while(current != null) {
for(Node prev=current; prev != null && prev.prev != null; prev = prev.prev) {
if(prev.data.compareTo(prev.prev.data) <= 0) {
swap(prev,prev.prev);
}
}
current = current.next;
}
}
このロジックを使用する際の最後の問題は、スワップされたときに電流が常に遅れており、同じ2つのノードがこのロジックで2回処理されることです。それを軽減する方法、つまりスワップ後に元の場所に電流を戻す方法はありますか?