Data structures 链表-数据结构
当下列链表的头节点作为输入传递时,下列函数的输出是什么? 1->2->3->4->5Data structures 链表-数据结构,data-structures,Data Structures,当下列链表的头节点作为输入传递时,下列函数的输出是什么? 1->2->3->4->5 def fun(head): if(head==None): return if head.get_next().get_next()!= None: print(head.get_data()," ", end='') fun(head.get_next()) print(head.get_data(),"
def fun(head):
if(head==None):
return
if head.get_next().get_next()!= None:
print(head.get_data()," ", end='')
fun(head.get_next())
print(head.get_data()," ",end='')
在递归调用
fun(head.get\u next())
之前和之后,都会调用print(head.get\u data(),“”,end='')
。第一次打印在if
块的第5行,第二次打印在if
块外的第7行
在第一个节点上时,这意味着函数将首先打印1
,然后执行递归调用,然后再次打印1
。因此,我们应该预计输出为:
1 [output of recursive call on second node] 1
当在第二和第三个节点上时,同样的事情发生;因此,第二个节点上的调用输出为:
2 [output of recursive call on third node] 2
因此,我们应该期望第一个节点上的输出为:
1 2 [output of recursive call on third node] 2 1
1 2 3 [output of recursive call on fourth node] 3 2 1
同样的事情也发生在节点3上,因此我们应该期望第一个节点上的输出为:
1 2 [output of recursive call on third node] 2 1
1 2 3 [output of recursive call on fourth node] 3 2 1
在对第四个节点的调用过程中,if
块不会执行,因为head.get\u next().get\u next()
是None
。因此,第一次打印和递归调用不会发生。所以我们只剩下一个打印,这意味着第四个节点上调用的输出就是4
最后,将所有这些放在一起,我们可以看到对第一个节点的调用的输出是:
1 2 3 4 3 2 1
思考正在发生的事情的一个好方法是想象一个“调用堆栈”。在第一个节点上调用fun
,结果是:
print3
指令,然后解除其堆栈;现在,第二个节点上的调用再次位于顶部;执行其剩余的print 2
,然后将其取消堆叠;对第一个节点的调用再次位于顶部;执行剩余的print 1
;最后,第一个节点上的调用被取消堆栈,并且调用堆栈为空,这意味着整个程序的执行完成