交换双向链表
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 noden";
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
的指针。
<-| 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
和n2n
的指针。看一下具有 sinplized 类 Node
和 corcted swap
函数的示例。
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 如何实现容纳整数和无效指针的双向链表?
- 为什么我的双向链表删除函数会删除多个节点?
- 我对数据结构、双向链表有一些问题
- C++ 双向链表:使用矩阵类成员创建和填充列表
- 在 c++ 中具有向量的双向链表构造函数
- 如何在双向链表上实现复制赋值?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 在双向链表中实现 Popback
- 在C++中反转双向链表
- 双向链表 - 无法删除第一个节点
- 我当前实现的双向链表类是否需要重构迭代器 end() 功能?
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- C++ 双向链表 - 插入同时保持递增顺序
- 如何找到双向链表的最大元素?
- 如何实现双向链表的迭代器?
- 双向链表问题 - 包含项目但不显示
- 使用双向链表中的指针交换节点
- 双向链表节点交换问题
- 交换双向链表