使用双向链表中的指针交换节点
swapping nodes using pointers in doubly linked list
这是我的代码,它只正确交换一次。如果我多次调用交换函数,那么它将无法正确交换。
CDoublyLinkedList& CDoublyLinkedList::swapNode(int index1, int index2) // the two nodes at given indices
{
if (index1 < 0) index1 = 0;
if (index1 >= count) index1 = count - 1;
if (index2 < 0) index2 = 0;
if (index2 >= count) index2 = count - 1;
if (index2 < index1)
{
int tempIndex = index1;
index1 = index2;
index2 = tempIndex;
}
if (index1 == index2)
{
return *this;
}
setPosition(index1);
Node* ptr1 = current;
setPosition(index2);
Node* ptr2 = current;
setPosition();
// The problem is in the code below this comment
Node* tempPrevNext;
Node* tempNextPrev;
Node* tempPrev;
Node* tempNext;
tempPrevNext = ptr1->prev->next;
tempNextPrev = ptr1->next->prev;
tempPrev = ptr1->prev;
tempNext = ptr1->next;
ptr1->prev->next = ptr2->prev->next;
ptr1->next->prev = ptr2->next->prev;
ptr1->prev = ptr2->prev;
ptr1->next = ptr2->next;
ptr2->prev->next = tempPrevNext;
ptr2->next->prev = tempNextPrev;
ptr2->prev = tempPrev;
ptr2->next = tempNext;
return *this;
}
最后,两个节点的所有指针都应该切换,但这只工作一次。任何帮助将不胜感激。
提前谢谢。
如果不看到其余代码,很难分辨,但我怀疑如果您交换列表的第一个或最后一个元素,就会发生错误。 这是因为您永远不会更新"head"节点以指向不同的项目,因此如果您交换第一个元素,它的新位置将被视为头部。
另外,您的阵列是圆形的吗? ptr1->prev->next
应该为列表的第一个元素引发 null 引用异常。
如果有帮助,您还可以通过摆脱tempPrevNext
和tempNextPrev
来清理代码。要记住的重要一点是,ptr1->prev->next
应在切换之前ptr1
,ptr2
切换后。
ptr1->prev->next = ptr2;
ptr1->next->prev = ptr2;
ptr2->prev->next = ptr1;
ptr2->next->prev = ptr1;
另外,您是否有理由希望 index1 小于 index2? 不应该有理由切换它们,除非如果你的索引井然有序,你的"设置位置"更有效。
评论下面的所有内容看起来都正确。 您确定 ptr1 和 ptr2 设置正确吗? 我没有看到"当前"在哪里设置。 全局变量是由 setPosition() 设置
相关文章:
- 共享指针的复制和交换效率
- 如何在单个链表中交换两个节点的位置,只修改指针
- 以原子方式交换指针与 nullptr
- 使用指针交换整数
- 使用指针 c++ 交换结构数组中的元素
- 使用指针交换数组的内容
- 无法使用指针写入交换
- 使用指针交换而不引用数组C++
- 共享指针交换方法标识更改
- 为什么基于指针交换两个值在函数范围之外不起作用?
- 将指针交换为指针
- 使用双向链表中的指针交换节点
- 使用指针交换字符变量
- 通过 xor 运算符使用引用或指针交换两个变量的值
- 指针交换怪异
- 当数组是类的数据成员时,如何使用指针交换数组
- 使用公用指针交换指向已分配内存的指针
- 使用指针交换两个字符串会输出奇怪的输出
- 仅通过操作指针交换链表中的相邻节点
- 使用指针交换两个变量