C++ 交换双链表

C++ 交换双链表,c++,sorting,nodes,swap,doubly-linked-list,C++,Sorting,Nodes,Swap,Doubly Linked List,好的 所以我一直在尝试实现一个带有交换函数的双链表 我在网上找到了许多网站解释了如何做到这一点——在几乎所有的网站中,包括一些来自堆栈溢出的网站,都有一个关于实现是否正确的评论。我试过几次,但都没有用。换句话说,我找不到这个算法的一个最终版本 我已经尝试了至少4-5种不同于我在网上找到的算法,还有一些我自己尝试过的算法,但是我不断发现元素排序错误的问题。我完全不知所措 以下是我尝试过的最新版本,但不起作用: template <typename T> void PriorityQue

好的

所以我一直在尝试实现一个带有交换函数的双链表

我在网上找到了许多网站解释了如何做到这一点——在几乎所有的网站中,包括一些来自堆栈溢出的网站,都有一个关于实现是否正确的评论。我试过几次,但都没有用。换句话说,我找不到这个算法的一个最终版本

我已经尝试了至少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;

}

我非常沮丧。请有人,请,请帮我看看一个完整的,有效的算法。没有链接到一个有坏算法的页面,也没有评论如何修复它,我已经尝试过几次了,但只是算法。它甚至不需要代码,只需要一个算法。请我已经厌倦了试图解决这个问题,因此这个项目的进度落后了。如果有人能帮我一劳永逸地解决这个问题,我将万分感激。

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

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;
在函数的开头有两个节点n1和n2,它们带有指向其他元素n1p、n1n、n2p、n2n的指针

您的问题是错误地更改了n1p、n1n、n2p和n2n的指针。
查看sinplified类节点和corrected swap函数。

您的类只包含指针,可能还包含一个int作为大小信息,对吗?在两者之间交换这些值。嗨,尼尔,我想这就是我在这里要做的。但是,我必须以错误的顺序分配值,因为当我打印排序的项目时,它们完全不符合顺序-事实上,这会导致SEGFULTS。如果您只是交换现有的项目,那就不应该有新的了。我很难相信你找不到一个在线资源来解决这么简单的问题……嗨,红色警报,我找到了一些,并实现了它们,但它们似乎工作不正常。然后在我找到它们的页面的评论部分,我发现人们对实现有不同意见。相信我,这让我很沮丧。
<-| p |  <-| p |  <-| p |
  |n1p|    | n1|    |n1n|
  | n |->  | n |->  | n |->

<-| p |  <-| p |  <-| p |
  |n2p|    | n2|    |n2n|
  | n |->  | n |->  | n |-> 
<-| p |  <-| p |  <-| p |
  |n1p|    | n2|    |n1n|
  | n |->  | n |->  | n |->

<-| p |  <-| p |  <-| p |
  |n2p|    | n1|    |n2n|
  | n |->  | n |->  | n |->