【问题标题】:Create a checkerboard or "Interweave" two linked-lists. IE changing the pointers of two linked lists创建一个棋盘格或“交织”两个链表。 IE改变两个链表的指针
【发布时间】:2020-05-19 01:54:41
【问题描述】:

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


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;
}

但是,尽管我相当确定我的逻辑是正确的,但该函数并没有做它应该做的事情。我也遇到了段错误:(

【问题讨论】:

  • 拿出铅笔和纸,先画方框和箭头来解决。
  • 我有,这就是我对这个逻辑有信心的原因。但是,我只是不确定我的实现是否正确。
  • 通过绘制该实现并与您的工作解决方案进行比较来验证实现。 (它跳得太远了。)
  • 请注意,经过一次迭代后,名称 firstBlackfirstRed 所指向的内容完全错误。 firstBlack 指向红色的第三个元素,firstRed 指向黑色的第三个元素

标签: c++ list pointers linked-list segmentation-fault


【解决方案1】:

您正在推进两步而不检查结束条件。因为你有奇数个项目,所以你取消引用一个空指针。

你不需要关心哪个尾部来自哪个列表来交换它们

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

【讨论】:

    【解决方案2】:

    这是一个足够简单的代码,请使用调试器并逐步调试代码。 另外请发布整个代码,而不仅仅是 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。我正在使用的系统上当前没有调试器,但这应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多