[英]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
應該為列表的第一個元素引發空引用異常。
如果有幫助,您還可以通過擺脫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? 應該沒有理由進行切換,除非您的索引正確,除非您的“設置”更加有效。
評論下方的所有內容看起來都很正確。 您確定ptr1和ptr2設置正確嗎? 我看不到“當前”設置在哪里。 setPosition()是否設置了全局變量?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.