好。
所以我一直在尝试使用交换功能实现双向链表。
我在网上发现了许多解释如何执行此操作的网站 - 在几乎所有这些网站(包括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;
}
我感到非常沮丧。请有人请,通过向我展示一个完整的,有效的算法来帮助我。没有链接到具有破碎算法的页面和关于如何修复它的评论(我现在已经尝试了几次),但只是算法。它甚至不需要是代码,只需要算法。请。我已经厌倦了尝试解决这个问题并因此落后于这个项目的日程安排,如果那里有人能够帮助我一劳永逸地解决这个问题,我会非常感激。
答案 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;
在函数的开头,您有两个节点n1
和n2
,其中包含指向其他元素n1p
,n1n
,n2p
,{{1}的指针}}
n2n
在带有<-| p | <-| p | <-| p |
|n1p| | n1| |n1n|
| n |-> | n |-> | n |->
<-| p | <-| p | <-| p |
|n2p| | n2| |n2n|
| n |-> | n |-> | n |->
变量的第一部分中,您交换temp
和n1
个节点的指针。所以你来到这样的情况。
n2
问题在于您错误地更改了<-| p | <-| p | <-| p |
|n1p| | n2| |n1n|
| n |-> | n |-> | n |->
<-| p | <-| p | <-| p |
|n2p| | n1| |n2n|
| n |-> | n |-> | n |->
,n1p
,n1n
和n2p
的指针。
请查看example中的n2n
字符Node
并修正swap
函数。