这段代码应该附加两个链表,我完全看不出这段代码是如何附加作为参数传递的两个 Cell Structs 的,因为第二个参数没有发生任何操作。它只是要求第一个 Cell 中的下一个节点 - 那么这如何工作呢?
void Append(Cell *& first, Cell* second)
{
if (first == NULL)
{
first = second;
}
else {
Append(first->next, second);
}
}
这段代码应该附加两个链表,我完全看不出这段代码是如何附加作为参数传递的两个 Cell Structs 的,因为第二个参数没有发生任何操作。它只是要求第一个 Cell 中的下一个节点 - 那么这如何工作呢?
void Append(Cell *& first, Cell* second)
{
if (first == NULL)
{
first = second;
}
else {
Append(first->next, second);
}
}
它递归直到是对第一个列表中最后一个指针的first
引用,它设置为指向第二个列表中的第一个。它不需要操纵(假设它是一个单链表)。next
Cell
Cell
second
这是一个递归算法,一直走到第一个列表(else
分支)的末尾;一旦找到结尾(first==NULL
),第二个列表的第一个元素将链接到第一个列表的最后一个元素,获得一个由两个原始列表连接而成的列表。
else
函数块一直跟随next
指针,first
直到它到达该列表的末尾。也就是说,直到first->next
isNULL
并且 theelse
不会被执行。
if
现在是块中的基本情况。当first->next
is时NULL
,它将指针更改为指向second
,这可能是另一个列表中的第一个元素。
有一些影响的原因是因为first->next
指针是通过引用传递的。修改指针将修改列表末尾的实际指针,而不仅仅是修改副本。
第二个列表不需要修改。代码将递归遍历第一个列表,直到它到达第一个列表中的最后一个元素,并将该元素的下一个指针设置为第二个列表的开头。第二个列表中的元素将由两个列表共享。
前:
第一 → a → b → c 第二→d→e→f
后:
第一 → a → b → c ↓ 第二→d→e→f