【问题标题】: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 块一直跟随first 的next 指针,直到它到达该列表的末尾。也就是说,直到 first->next 是 NULL 并且 else 不会被执行。
现在是if 块中的基本情况。当first->next 为NULL 时,它会将该指针更改为指向second,这可能是另一个列表中的第一个元素。
之所以有一些影响是因为first->next指针是通过引用传递的。修改指针会修改链表末尾的实际指针,而不仅仅是修改一个副本。
【解决方案2】:
它递归直到first 是对第一个列表中最后一个Cell 的next 指针的引用,它设置为指向第二个列表中的第一个Cell。它不需要操纵second(假设它是一个单链表)。
【解决方案3】:
这是一个递归算法,一直走到第一个列表的末尾(else 分支);一旦找到结尾 (first==NULL),第二个列表的第一个元素将链接到第一个列表的最后一个元素,从而获得一个由两个原始列表串联而成的列表。
【解决方案4】:
第二个列表不需要修改。代码将递归遍历第一个列表,直到它到达第一个列表中的最后一个元素,并将该元素的 next 指针设置为第二个列表的开头。第二个列表中的元素将由两个列表共享。
之前:
第一 → a → b → c
第二→d→e→f
之后:
第一 → a → b → c
↓
第二→d→e→f