了解遍历列表的控制流程

时间:2014-04-21 17:47:26

标签: python recursion linked-list

这里我有一个构造节点的类和一个以相反顺序打印出节点的函数:

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后如何反向打印?我不理解这里的流程。

2 个答案:

答案 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;通过将顶牌从牌组中取出并将其放在新筹码的顶部来构建新筹码。在您使用所有卡完成此操作后,从上到下浏览新堆栈并查看每张卡。"当您从上到下穿过甲板时,您将从下到上将卡放入新堆栈中,因此您可以反转堆栈。只有在你将所有卡片堆叠到这个反向堆叠中后,你才会回过头来看看它们(就像"打印"它们),此时你在看它们逆序。