2011-10-26 21 views
3

ソートの選択を実装しています。要素を交換する必要があります。 私は前と次のリンクとリストを二重にリンクしました。 そして、私はいつもtoStartFromスワップ要素二重リンクリスト

public void Swap(Node toStartFrom, Node b) { 
     Boolean NextToEachOther = (toStartFrom.next == b); 
     toStartFrom.next = b.next; 
     b.previous = toStartFrom.previous; 
     if (NextToEachOther) { 
      toStartFrom.previous = b; 
      b.next = toStartFrom; 
     } else { 
      toStartFrom.previous = b.previous; 
      b.next = toStartFrom.next; 
     } 
    } 

    public void display() { 
     Node current = first; 
     while (current != null) { 
      ...printing... 
      current = current.next; 
     } 
    } 

最初のノードで、いくつかのノードbを交換する必要がある。しかし、それは動作しません一覧 の最初と最後の要素へのリンク。 エラーはありません。正しい順序で並べ替えられません。 toStartFromノードの後に​​ソート後に要素を表示しません。あなたはまた、2は、例えば

をスワップしているの隣にあるノードを更新する必要が

+0

単純なデータセットのデバッガでコードをステップ実行したとき、あなたは何を観察しましたか? –

+0

また、要素の1つが頭部であることが保証されている二重リンクリストの場合、6つの参照を更新する必要があります。理由を見るために絵を描く。 –

+0

デバッグでは、デバッグ時にスワップされている可能性があります。表示に問題があるかもしれません。 – Nikita

答えて

2

は、このリストを考えてみましょう。

最初 - > A - > B - > C

あなたの場合最初に交換したい場合は、aとcの次の参照と前の参照を更新する必要があります。

編集:このコードはブール宣言

EDIT2後にスワップし、右をして、あなたのコードの前に配置する必要があります。また、あなたがリストの先頭/テールにrefencesを持っている場合、あなたはそれらを更新する必要がありますあまりにも。私はあなたのコード内のどこでも頭や尾を参照していることはわかりません。

if(toStartFrom.prev != null) 
{ 
    toStartFrom.prev.next = b; 
} 
if(toStartFrom.next != b) // Equivalent to NextToEachOther 
{ 
    toStartFrom.next.prev = b; 
} 
if(b.next != null) 
{ 
    b.next.prev = toStartFrom; 
} 
if(b.prev != toStartFrom) // Equivalent to NextToEachOther 
{ 
    b.prev.next = toStartFrom 
} 
+0

それは正しいです、私は一般的な場合には6つのリンクを変更する必要がありますが、 2つの要素でも機能します。 – Nikita

+0

あなたは私のedit2も考えましたか?あなたがそれらを追跡している場合(そしてなぜあなたはいないでしょうか)頭/尾の参照を更新する必要があります – Akron

+0

@気分:何ですか?私はあなたを完全に理解していないと思います。あなたのコードは間違いなく完全です。周囲のノード参照も変更しなければならず、明らかにそうではありません。あなたは潜在的に最大8つの参照を変更する必要がありますが、私はそれを取得します。 – Akron

関連する問題