Data structures 链表-数据结构

Data 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(),"

当下列链表的头节点作为输入传递时,下列函数的输出是什么? 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()," ",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
,结果是:

  • 打印1{TO DO}
  • 对第二个节点{TO DO}的递归调用
  • 打印1{TO DO}
  • 执行递归调用时,函数的执行会在等待递归调用结束时中断。因此,新调用“堆叠”在前一个未完成的调用之上。因此,堆栈的第一层现在是:

  • 打印1{完成}
  • 对第二个节点{进行中}的递归调用
  • 打印1{TO DO}
  • 并在顶部添加一个新层:

  • 打印2{TO DO}
  • 对第三个节点{TO DO}的递归调用
  • 打印2{TO DO}
  • 随着递归调用的进行,新的层被放在调用堆栈上,第一次打印变为{DONE},最后一次打印剩余{TODO}

    一旦对第一个节点的调用终止,它将被取消堆栈。因此,第三个节点上的调用再次位于顶部;执行其剩余的
    print3
    指令,然后解除其堆栈;现在,第二个节点上的调用再次位于顶部;执行其剩余的
    print 2
    ,然后将其取消堆叠;对第一个节点的调用再次位于顶部;执行剩余的
    print 1
    ;最后,第一个节点上的调用被取消堆栈,并且调用堆栈为空,这意味着整个程序的执行完成