2011-10-26 89 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