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

时间:2015-04-28 16:52:59

标签: 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;
}

最后,应切换两个节点的所有指针,但这仅适用一次。任何帮助,将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果没有看到其余的代码,很难分辨,但我怀疑如果你要交换列表的第一个或最后一个元素,就会发生错误。这是因为你永远不会更新你的头脑&#39;节点指向不同的项目,因此如果您交换第一个元素,它的新位置将被视为头部。

另外,你的阵列是圆形的吗? 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?切换它们不应该是理由,除非你的设置位置不正确。如果您的指数有序,则效率更高。

答案 1 :(得分:0)

评论下方的所有内容都是正确的。你确定ptr1和ptr2设置正确吗?我不知道&#34;当前&#34;正在设定。是由setPosition()设置的全局变量吗?