Recursion 递归函数如何在具有堆栈概念的链表中工作?
这里我给出了一个代码来打印链接列表的反面 fun1()以相反的方式打印给定的链表。对于链表1->2->3->4->5,fun1()打印5->4->3->2->1Recursion 递归函数如何在具有堆栈概念的链表中工作?,recursion,linked-list,function-call,Recursion,Linked List,Function Call,这里我给出了一个代码来打印链接列表的反面 fun1()以相反的方式打印给定的链表。对于链表1->2->3->4->5,fun1()打印5->4->3->2->1 void fun1(struct node* head) { if(head == NULL) return; fun1(head->next); printf("%d ", head->data); } 有人能解释一下每次调用fun1()时堆栈框架是如何构建的吗? 我希望链表的最后一个节点会打印出
void fun1(struct node* head)
{
if(head == NULL)
return;
fun1(head->next);
printf("%d ", head->data);
}
有人能解释一下每次调用fun1()时堆栈框架是如何构建的吗?
我希望链表的最后一个节点会打印出来。但我得到的链表顺序相反。它不会使链表反转。它只是反向打印。我认为这是由于像Push/Pop这样的堆栈操作造成的。但我不太清楚。请通过图表中的逐步操作帮助我理解。我不太确定您想要实现什么。你的代码准确地打印出它应该做什么。以下是满足您期望的代码段: 我希望链表的最后一个节点会打印出来
如果向其提供列表1->2:
void fun1(struct node* head)
{
if(head == NULL)
return;
printf("%d ", head->data);
fun1(head->next);
}
是这样的:
void print_last(struct node* n)
{
if( n == NULL )
{
printf("empty list!");
}
else if( n->next == NULL )
{
printf("%d", n->data);
}
else
{
print_last(n->next);
}
}
void print_last(struct node* n)
{
if( n == NULL )
{
printf("empty list!");
}
else if( n->next == NULL )
{
printf("%d", n->data);
}
else
{
print_last(n->next);
}
}
使用您得到的相同列表1->2调用
请注意,当找到最后一个元素时,它不会递归,因此n为null的唯一方法是,如果您尝试打印空链表(null)。这个问题不清楚。如果代码以相反的顺序打印列表的内容,则不会尝试以相反的顺序重新生成列表。这似乎让你感到惊讶。您是否要求使用代码来实际反转列表?或者对当前代码如何工作的解释?