如何使用递归的反向链表工作

时间:2018-02-01 11:44:31

标签: python python-3.x recursion linked-list

我正在学习Python中的数据结构,我遇到了code,我不明白。 我有一个节点类

class Node():
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

和linkedlist类

class LinkedList():
    def __init__(self):
        self.head = Node()
    ...
    ...
    def reversePrint(self, node=None):
        if node == None:
            node = self.head
        if node.next:
            self.reversePrint(node.next)
        print(node.data)

方法追加,删除和查找都很好 但我似乎无法理解这个方法reverse_print如何以相反的顺序呈现链表节点,我希望只打印最后一个节点数据而不是整个链表节点。

这是我的code

2 个答案:

答案 0 :(得分:1)

魔术发生在以下两行:

if node.next:
        self.reversePrint(node.next)

如果节点有后继节点,它将再次调用相同的方法,一直到列表末尾。然后它将展开调用堆栈,并以相反的顺序打印每个节点中的数据(因为在递归调用print(node.data)之后出现reversePrint)。如果你切换print语句和递归调用它将按正向顺序打印它,这更容易掌握。

答案 1 :(得分:1)

假设您的链接列表是

Node A: data="alpha"
Node B: data="beta"
Node C: data="gamma"

您致电ll.reversePrint()node设置为head,即节点A.

节点=节点A的

reversePrint检查下一个节点(节点B),并调用reversePrint,传入节点B.

节点=节点B的

-> reversePrint,检查下一个节点(节点C),并调用reversePrint,传入节点C.

节点=节点C的

-> -> reversePrint检查下一个节点(没有一个节点)。

带有node = Node C的

-> -> reversePrint打印节点的数据:"gamma"

带有node = Node B的

-> reversePrint打印节点的数据:"beta"

节点=节点A的

reversePrint打印节点的数据:"alpha"

箭头表示递归的深度。