交换双重链接列表

时间:2014-11-17 01:22:36

标签: c++ sorting nodes swap doubly-linked-list

好。

所以我一直在尝试使用交换功能实现双向链表。

我在网上发现了许多解释如何执行此操作的网站 - 在几乎所有这些网站(包括Stack Overflow中的一些网站)中,一个参数从关于实现是否正确的评论开始。我试过其中几个无济于事。换句话说,我找不到这个算法的单个确定版本。

我尝试过至少4-5种与我在网上找到的算法不同的算法,以及一些我试图整理自己的算法,但我一直在解决元素排序不正确的问题。我完全在我的智慧结束。

这是我尝试的最新版本,但不起作用:

template <typename T>
void PriorityQueue<T>::swap(Node * n1, Node * n2){
    if(n1 == n2)
        return;
    if(n1 == 0 || n2 == 0){
        std::cout << "\nPRIORITYQUEUE ERROR: Trying to swap with non-existent node\n";
        return;
    }

    Node * temp = new Node;

    temp->prev = n1->prev;
    temp->next = n1->next;

    n1->prev = n2->prev;
    n1->next = n2->next;

    n2->prev = temp->prev;
    n2->next = temp->next;

    if(n1->next != 0)
        n1->next->prev = n2;
    if(n1->prev != 0)
        n1->prev->next = n2;
    if(n2->next != 0)
        n2->next->prev = n1;
    if(n2->prev != 0)
        n2->prev->next = n1;

    delete temp;

}

我感到非常沮丧。请有人请,通过向我展示一个完整的,有效的算法来帮助我。没有链接到具有破碎算法的页面和关于如何修复它的评论(我现在已经尝试了几次),但只是算法。它甚至不需要是代码,只需要算法。请。我已经厌倦了尝试解决这个问题并因此落后于这个项目的日程安排,如果那里有人能够帮助我一劳永逸地解决这个问题,我会非常感激。

1 个答案:

答案 0 :(得分:0)

你在最后几行的问题。我纠正了他们:

if(n1->next != 0)
    n1->next->prev = n1; // n2;
if(n1->prev != 0)
    n1->prev->next = n1; // n2;
if(n2->next != 0)
    n2->next->prev = n2; // n1;
if(n2->prev != 0)
    n2->prev->next = n2; // n1;

在函数的开头,您有两个节点n1n2,其中包含指向其他元素n1pn1nn2p,{{1}的指针}}

n2n

在带有<-| p | <-| p | <-| p | |n1p| | n1| |n1n| | n |-> | n |-> | n |-> <-| p | <-| p | <-| p | |n2p| | n2| |n2n| | n |-> | n |-> | n |-> 变量的第一部分中,您交换tempn1个节点的指针。所以你来到这样的情况。

n2

问题在于您错误地更改了<-| p | <-| p | <-| p | |n1p| | n2| |n1n| | n |-> | n |-> | n |-> <-| p | <-| p | <-| p | |n2p| | n1| |n2n| | n |-> | n |-> | n |-> n1pn1nn2p的指针。 请查看example中的n2n字符Node并修正swap函数。