簡體   English   中英

使用雙向鏈接列表中的指針交換節點

[英]c++ - 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;
}

最后,兩個節點的所有指針都應該切換,但這只能工作一次。 任何幫助,將不勝感激。

提前致謝。

很難看到沒有看到其余代碼的情況,但是我懷疑如果交換列表的第一個或最后一個元素,就會發生錯誤。 這是因為您永遠不會更新“頭部”節點以指向其他項目,因此,如果交換第一個元素,則將其新位置視為頭部。

另外,數組是圓形的嗎? 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? 應該沒有理由進行切換,除非您的索引正確,除非您的“設置”更加有效。

評論下方的所有內容看起來都很正確。 您確定ptr1和ptr2設置正確嗎? 我看不到“當前”設置在哪里。 setPosition()是否設置了全局變量?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM