python - 递归计算链表中的节点数

标签 python recursion linked-list

问题:返回链表中的节点数。

最近在学习递归。我知道如何使用迭代来解决这个问题,但我坚持使用递归方式。下面是我的代码,它总是返回 1 而不是链表的实际计数。我无法弄清楚问题所在,希望有人可以帮助我。我该如何解决这个问题?

def numberOfNodes(head):
   total_node = 0
   return __helper(total_node, head)


def __helper(total_node, head):
   if not head:
      return total_node += 1
   __helper(total_node, head.next)
   return total_node

最佳答案

对于这类事情来说,递归是一个糟糕的选择(增加了开销,并且有无缘由地破坏调用堆栈的风险),但如果您确实将其用于教育目的,那么最简单的方法是将总数传递到调用堆栈,而不是下:

def linked_list_len(head):
   return linked_list_len(head.next) + 1 if head else 0

基本上,在 head 节点所在的每帧添加 1,然后使用下一个节点再次调用该函数。基本情况是当 headNone 时。

在某些语言中提供 tail call optimization ,您可以避免每帧子递归调用返回的变量发生 + 1 工作。这允许编译器或解释器将递归转换为循环,避免堆栈溢出。代码如下所示(与您的方法类似,不同之处在于在递归调用中添加了 + 1):

def linked_list_len(head, total=0):
    return linked_list_len(head.next, total + 1) if head else total

但是Python doesn't support TCO所以你不妨用上面所示的更简单的方式来编写它。

关于python - 递归计算链表中的节点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61993565/

相关文章:

python - 类型错误:需要一个可读的缓冲区对象

python - 元组的二分查找

python - 如何修复这个链表算法

java - 按度数对多项式链表进行排序

java - Java中使用插入排序方法对链表进行排序

python - 使用 cookiejar 删除 cookies/结束 session

python将 '|'更改为制表符分隔

python - 将所有元素放在具有相同名称的字典形式中

c# - Tic Tac Toe 的 Minimax 算法

javascript - 递归 Javascript camelCase 解释