【问题标题】:C++: Appending linked list recursivelyC++:递归附加链表
【发布时间】:2012-12-22 21:15:51
【问题描述】:

这段代码应该附加两个链表,我完全看不出这段代码是如何附加作为参数传递的两个单元结构的,因为第二个参数没有发生任何操作。它只是要求第一个 Cell 中的下一个节点 - 那么这如何工作?

void Append(Cell *& first, Cell* second)
{
  if (first == NULL)
  {
    first = second;
  }
else {
    Append(first->next, second);
  }
}

【问题讨论】:

    标签: c++ pointers recursion linked-list


    【解决方案1】:

    函数的else 块一直跟随firstnext 指针,直到它到达该列表的末尾。也就是说,直到 first->nextNULL 并且 else 不会被执行。

    现在是if 块中的基本情况。当first->nextNULL 时,它会将该指针更改为指向second,这可能是另一个列表中的第一个元素。

    之所以有一些影响是因为first->next指针是通过引用传递的。修改指针会修改链表末尾的实际指针,而不仅仅是修改一个副本。

    【讨论】:

      【解决方案2】:

      它递归直到first 是对第一个列表中最后一个Cellnext 指针的引用,它设置为指向第二个列表中的第一个Cell。它不需要操纵second(假设它是一个单链表)。

      【讨论】:

        【解决方案3】:

        这是一个递归算法,一直走到第一个列表的末尾(else 分支);一旦找到结尾 (first==NULL),第二个列表的第一个元素将链接到第一个列表的最后一个元素,从而获得一个由两个原始列表串联而成的列​​表。

        【讨论】:

          【解决方案4】:

          第二个列表不需要修改。代码将递归遍历第一个列表,直到它到达第一个列表中的最后一个元素,并将该元素的 next 指针设置为第二个列表的开头。第二个列表中的元素将由两个列表共享。

          之前:

          第一 → a → b → c 第二→d→e→f

          之后:

          第一 → a → b → c ↓ 第二→d→e→f

          【讨论】:

            猜你喜欢
            • 2013-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-21
            • 1970-01-01
            • 2013-12-12
            • 2017-05-07
            相关资源
            最近更新 更多