c++ - 在双向链表中使用指针交换节点

标签 c++

这是我的代码,它只能正确交换一次。如果我多次调用交换函数,则它不会正确交换。

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;
}

最后两个节点的所有指针都应该交换,但这只能工作一次。任何帮助,将不胜感激。

提前致谢。

最佳答案

如果不看您的其余代码就很难判断,但我怀疑如果您交换列表的第一个或最后一个元素,就会出现错误。那是因为你永远不会更新你的“头”节点以指向不同的项目,所以如果你交换第一个元素,它的新位置将被视为头。

还有,你的数组是圆形的吗? ptr1->prev->next 应该为列表的第一个元素抛出空引用异常。

如果有帮助,您还可以通过删除 tempPrevNexttempNextPrev 来清理您的代码。 重要的是要记住 ptr1->prev->next 应该是 ptr1 在开关之前,ptr2 在之后。

ptr1->prev->next = ptr2;
ptr1->next->prev = ptr2;
ptr2->prev->next = ptr1;
ptr2->next->prev = ptr1;

此外,您是否希望 index1 小于 index2?不应该有理由切换它们,除非你的'setposition'在你的索引有序的情况下更有效率。

关于c++ - 在双向链表中使用指针交换节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925412/

相关文章:

c++ - 如何在C/C++中实现确定性多线程?

c++ - 指向私有(private)成员函数数组的指针

c++ - 创建静态哨兵节点的正确方法是什么

c++ - 给定 2 个点和从第一个点到我必须找到的点的范围。如何找到我必须找到的点(在3D空间上)

c++ - 使用 MPFR 将 float 转换为字符串

c++ - 如果未传递参数,则使用默认值

c++ - 没有wx主程序的wxWidgets——如何编码?

c++ - 简单的欧拉物理,奇怪的行为

c++ - `using`的开销

c++ -/usr/bin/ld : cannot find -lGL