使用双向链表中的指针交换节点

swapping nodes using pointers in doubly linked list

本文关键字:指针 交换 节点 双向链表      更新时间:2023-10-16

这是我的代码,它只正确交换一次。如果我多次调用交换函数,那么它将无法正确交换。

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 引用异常。

如果有帮助,您还可以通过摆脱tempPrevNexttempNextPrev来清理代码。要记住的重要一点是,ptr1->prev->next应在切换之前ptr1ptr2切换后。

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

另外,您是否有理由希望 index1 小于 index2? 不应该有理由切换它们,除非如果你的索引井然有序,你的"设置位置"更有效。

评论下面的所有内容看起来都正确。 您确定 ptr1 和 ptr2 设置正确吗? 我没有看到"当前"在哪里设置。 全局变量是由 setPosition() 设置

的吗?