2011-10-26 145 views
3

我實現了選擇排序,我需要交換元素。 我有雙重鏈接列表與上一個和下一個鏈接。 和鏈接列表 我總是需要交換一些節點b與第一個節點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; 
     } 
    } 

但它不工作的第一個和最後一個元素。 沒有錯誤只是不正確的順序排序。 而不是在toStartFrom節點之後排序後顯示任何元素。

+0

當您在簡單數據集中的調試器中遍歷代碼時,您觀察到了什麼? –

+0

此外,對於其中一個元素保證爲頭部的雙向鏈表,您將需要更新6個引用。畫一張圖片,看看爲什麼。 –

+0

在調試中,確定它們在調試時交換過,也許我有一個顯示問題。 – Nikita

回答

2

您還需要更新的項目旁邊的2被交換

例如節點,考慮這個名單:

第一 - >一個 - 「乙 - 」ç

如果您希望先交換,然後你必須更新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個鏈接,但是我排序它不會'即使有兩個元素也可以工作。 – Nikita

+0

您是否也考慮過編輯2?如果你正在跟蹤它們,你必須更新頭部/尾部參考(以及爲什麼你不會?) – Akron

+0

@Nikita:什麼?我想我不完全瞭解你。你的代碼絕對不完整。你也必須改變周圍的節點引用,你顯然不是。您可能需要更改最多8個引用,而不是6 – Akron