【问题标题】:How reverse linkedlist using recursion works使用递归的反向链表如何工作
【发布时间】:2018-07-11 17:33:09
【问题描述】:

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

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

和链表类

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)

append 和 delete 和 find 方法运行良好 但我似乎无法理解这种方法reverse_print 如何以相反的顺序呈现链表节点我希望只打印最后一个节点数据而不是以相反的顺序打印整个链表节点。

这是我的code

【问题讨论】:

  • 它为下一个节点调用reversePrint,然后打印自己的数据。所以它向前递归,并打印自己的数据last。其他一切都只是理解递归。
  • @khelwood 我的理解是 reversePrint 将被调用而无需任何打印,直到它因为 if 语句而命中最后一个元素,所以print(node.data) 如何以它应该调用的相反顺序调用整个列表只有最后一个元素值我无法得到它

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


【解决方案1】:

假设你的链表是

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

您调用ll.reversePrint() 并且node 被设置为head,即节点A。

reversePrint 与 node=Node A,检查下一个节点(即节点 B),并调用 reversePrint,传入节点 B。

-> reversePrint 与 node=Node B,检查下一个节点(即节点 C),并调用 reversePrint,传入节点 C。

-> -> reversePrint 使用 node=Node C,检查下一个节点(没有节点)。

-> -> reversePrint with node=Node C 打印节点的数据:"gamma"

-> reversePrint with node=Node B 打印节点的数据:"beta"

reversePrint with node=Node A 打印节点的数据:"alpha"

箭头表示递归的深度。

【讨论】:

  • 它和我一起点击了!谢谢。你的图表对我来说很简单。
【解决方案2】:

魔法发生在这两行:

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

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

【讨论】:

  • 所以每次self.reversePrint(node.next) 被称为print(node.data) 堆栈在程序内存中还是什么?
  • 正是如此,是的:)
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 2011-12-19
  • 2013-03-04
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多