这里我有一个构造节点的类和一个以相反顺序打印出节点的函数:
class LLNode(object):
def __init__(self, data):
'''(LLNode, object) -> NoneType
Create a new node to hold data
'''
self.data = data
self.link = None
def __str__(self):
return str(self.data)
def reverse_list(L):
if L is None: return
head = L
tail = head.link
reverse_list(tail)
print(head, end=' ')
list1 = LLNode(1)
list1.link = LLNode(2)
print(reverse_list(list1))
我不明白的是当print
语句运行时,因为reverse_list(tail)
放在它之前,对我来说它看起来好像被忽略了。我发现如果我切换这两行,程序将按顺序打印链表,这对我来说很有意义。放置print
后如何反向打印?我不理解这里的流程。
答案 0 :(得分:1)
因为在递归调用之后print
,所以当控制返回到调用函数时,它会在备份调用的路上发生。这是一个简单的例子:
>>> def recur(x):
print("Going down ({0}).".format(x))
if not x:
print("Hit bottom")
print("Coming up ({0}).".format(x))
return None
recur(x-1)
print("Coming up ({0}).".format(x))
>>> recur(2)
Going down (2).
Going down (1).
Going down (0).
Hit bottom
Coming up (0).
Coming up (1).
Coming up (2).
答案 1 :(得分:1)
请注意,它打印的内容是列表的head
。在每一步,它都会剥离"列表的第一个元素存储它,然后在列表的其余部分递归调用自身。在最后一次调用时,它只剩下一个元素。然后它将打印该元素并返回上一个调用,该调用将打印它剥离的元素,这是倒数第二个元素。然后,它将返回到之前的调用,该调用将在此之前打印元素,依此类推。
您可以将其视为拥有一副牌,并且算法是,#34;通过将顶牌从牌组中取出并将其放在新筹码的顶部来构建新筹码。在您使用所有卡完成此操作后,从上到下浏览新堆栈并查看每张卡。"当您从上到下穿过甲板时,您将从下到上将卡放入新堆栈中,因此您可以反转堆栈。只有在你将所有卡片堆叠到这个反向堆叠中后,你才会回过头来看看它们(就像"打印"它们),此时你在看它们逆序。