[英]Linked list recursion..Why do I need return statement?
void add(llist *list, lnode *newNode){
list->size++;
addRecursion(&list->head, newNode);
}
lnode* addRecursion(lnode **node, lnode *newNode){
if(*node == NULL){
*node = newNode;
}
else{
lnode *nextNode = (*node)->next;
(*node)->next = addRecursion(&nextNode, newNode);
}
return *node;
}
这段代码工作正常。.我在线查看了一下代码,并进行了一些更改。 但是我仍然不明白为什么addRecursion函数必须具有返回类型。 我改变了功能
void addRecursion(lnode **node, lnode *newNode){
if(*node == NULL){
*node = newNode;
}
else{
lnode *nextNode = (*node)->next;
addRecursion(&nextNode, newNode);
}
}
那就没用..
它总是返回存储在* node中的值,并且在修改后的代码中它会丢失该值,因为递归调用传递的是本地临时变量而不是实际需要放置该值的位置,然后在返回后进行存储。 一个非常奇怪的构造。 如果您只是删除了本地变量,则可以使addRecursion无效(并且更简单):
void addRecursion(lnode **node, lnode *newNode){
if(*node == NULL){
*node = newNode;
}else{
addRecursion(&(*node)->next, newNode);
}
}
给(*node)->next
分配一些东西。 我想这指向列表的下一个节点。 因此,在没有分配的情况下,列表不会转到要向其添加新节点的最后一个节点。 递归可以用迭代代替。
因为该函数正在返回算法中设置最终节点所需的下一个节点的地址。
随着递归的进行,可能有助于可视化调用堆栈的增长/缩小。 假定以下列表:
node1 -> node2 -> node3 -> null
然后addRecursion
如下所示展开(伪代码):
addRecursion(&node1, newNode)
node1.next = addRecursion(&node2, newNode);
node2.next = addRecursion(&node3, newNode);
node3.next = addRecursion(null, newNode); // returns &newNode
node3.next = &newNode;
node2.next = &node3;
node1.next = &node2;
// return value ignored
新节点将添加到末尾,并且链中的每个链接都将保留。
如果您对代码进行了这种调整,它也应该起作用,因为您通过引用递归函数调用传递了nextNode
的值,从而将nextNode
的值重新分配回了(*node)->next
(因此,在以后的递归调用):
void addRecursion(lnode **node, lnode *newNode)
{
if(*node == NULL)
{
*node = newNode;
return;
}
lnode *nextNode = (*node)->next;
addRecursion(&nextNode, newNode);
(*node)->next = nextNode; //Add this line to re-connect the link
}
上面的Chris版本更加干净,因为它分派了两个分配,并且这样做还节省了堆栈上的空间,因为不需要本地指针变量nextNode
存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.