创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针



所以我有两个链表,每个链表都保存一种颜色:


1.黑>2.黑>3.黑>4.黑>5.黑>无

1.红 ->2.红 ->3.红 ->4.红 ->5.红 ->空


我希望函数返回


1.黑>2.红->3.黑>4.红->5.黑>无

1.红色 ->2.黑色->3.红色 ->4.黑色->5.红色 ->空。


让我们命名第一个指针,第一个黑色和第一个红色。为了实现这种"棋盘"模式,我通过简单的交换将每个第一个指向的节点切换到另一个列表,将指针前进两个点,然后重复直到我到达列表的末尾。

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.调试器当前在我使用的系统上不可用,但这应该可以工作。

您正在前进两步而不检查结束条件。由于项目数为奇数,因此取消引用 null 指针。

你不需要关心哪个尾巴起源于哪个列表来交换它们

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

相关内容

  • 没有找到相关文章