这是我的代码,它只能正确交换一次。如果我多次调用交换函数,那么它就不能正确交换。
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;
}
最后,应切换两个节点的所有指针,但这仅适用一次。任何帮助,将不胜感激。
提前致谢。
答案 0 :(得分:1)
另外,你的阵列是圆形的吗? ptr1->prev->next
应该为列表的第一个元素抛出一个空引用异常。
如果有帮助,您还可以通过删除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?切换它们不应该是理由,除非你的设置位置不正确。如果您的指数有序,则效率更高。
答案 1 :(得分:0)
评论下方的所有内容都是正确的。你确定ptr1和ptr2设置正确吗?我不知道&#34;当前&#34;正在设定。是由setPosition()设置的全局变量吗?