簡體   English   中英

創建一個棋盤或“交織”兩個鏈表。 IE 改變兩個鏈表的指針

[英]Create a checkerboard or "Interweave" two linked-lists. IE changing the pointers of two linked lists

所以我有兩個鏈表,每個鏈表都有一個顏色:


1.black->2.black->3.black->4.black->5.black->NULL

1.red ->2.red ->3.red ->4.red ->5.red ->NULL


我希望函數返回


1.black->2.red ->3.black->4.red ->5.black->NULL

1.red ->2.black->3.red ->4.black->5.red ->NULL。


讓我們命名第一個指針,firstBlack 和 firstRed。 為了實現這種“棋盤”模式,我通過簡單的交換將每個首先指向的節點切換到另一個列表,將指針前進兩個點,然后重復直到我到達列表的末尾。

while(firstBlack->next != NULL && firstRed->next != NULL) {
   Node * temp = firstBlack->next;
   firstBlack->next = firstRed->next;
   firstRed->next = temp;

   firstBlack = firstBlack->next->next;
   firstRed = firstRed->next->next;
}

然而,盡管我相當確定我的邏輯是正確的,但該函數並沒有做它應該做的。 我也遇到了段錯誤:(

這是一個足夠簡單的代碼,請使用調試器並逐步調試代碼。 另外請發布整個代碼,而不僅僅是while循環中的內容。

此代碼應該可以正常工作。

//Some methods to create these linked lists.
pBlackHead = CreateBlackList();
pRedHead = CreateRedList();

firstBlack = pBlackHead;
firstRed = pRedHead;

while(firstBlack->next != NULL && firstRed->next != NULL){
Node * temp = firstBlack->next;
firstBlack->next = firstRed->next;
firstRed->next = temp;

firstBlack = firstBlack->next;
firstRed = firstRed->next;}

在打印列表以檢查正確性時,請使用pBlackHead , pRedHead 我正在使用的系統上目前沒有調試器,但這應該可以工作。

您在不檢查結束條件的情況下前進了兩個步驟。 因為您有奇數個項目,所以您取消引用一個空指針。

你不需要關心哪個尾部起源於哪個列表來交換它們

for(; left->next && right->next; left = left->next, right = right->next) {
    std::swap(left->next, right->next);
}

暫無
暫無

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

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