【问题标题】:Python Linked List lengthPython 链表长度
【发布时间】:2021-06-04 17:26:31
【问题描述】:

我正在尝试在 python 中实现一个链表和一个计算链表长度的函数。代码如下:

class Node:
    def __init__(self, data, nxt=None):
        self.data = data
        self.nxt = nxt
def length(node):
    if not node:
        return 0
    return 1 + length(node.nxt)

但是我的 jupyter notebook 提出了一个AttributeError: 'int' object has no attribute 'nxt'

你知道它来自哪里/我可以如何阻止它使代码正常工作吗?

我发现了一个非常相似的问题 (Finding the length of a linked list in python),但我使用的实现只在答案中,所以我无法直接回复该答案(我只能用 15 个字符发表评论)。

非常感谢!

编辑:

对不起,我没有在周末阅读 cmets,但这是我使用上面的 sn-ps 的代码。正如@juanpa.arrivillaga 猜测的那样,这确实是为了锻炼。 @D4NieLDev 我猜你是对的,我传递了一个 int 而不是 Node 对象,但我不知道如何正确地做。

def intersection(a, b):
    m, n = length(a), length(b)
    cur_a, cur_b = a, b
    
    if m > n:
        for _ in range(m - n):
            cur_a = cur_a.nxt
        
    else:
        for _ in range(n - m):
            cur_b = cur_b.nxt
    
    while cur_a != cur_b:
        cur_a = cur_a.nxt
        cur_b = cur_b.nxt
        
    return cur_a

这是一个应该找到两个链表的相交节点的函数,这里是链表:

a3 = Node(10, nxt=None)
a2 = Node(8, nxt=a3)
a1 = Node(7, nxt=a2)
a0 = Node(3, nxt=a1)

b3 = Node(10, nxt=None)
b2 = Node(8, nxt=b3)
b1 = Node(1, nxt=b2)
b0 = Node(99, nxt=b1)

我这样称呼这个函数:

intersection(a0, b0)

编辑编号。 2: 上面的代码现在对于length() 函数可以正常工作,但对于intersection() 函数则不能正常工作,它什么也没产生。你知道我该如何解决这个问题吗?

【问题讨论】:

  • 能否展示代码,在哪里创建节点并调用length 方法?
  • 您必须提供minimal reproducible example。注意,一般来说你应该避免在 python 中递归,因为递归限制相当严格(大约 1000)
  • 您似乎传递的是整数而不是 Node 对象。
  • 与其创建一个用于查找长度的新函数,不如在链表类中使用一个长度变量,该变量在每次插入时递增,在每次删除时递减。此功能只会为您的程序增加额外的成本。
  • @DashrathChauhan 是的,我想这都是为了学术练习。您很少需要在 Python 中实现链表。但是,是的,仅在内部跟踪长度将是最省时的方法。

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


【解决方案1】:

似乎答案是如此明显,我没有看到它。问题出在intersection() 函数中,因为我直接比较了它们之间的Node 对象而不是比较它们的值,并且在运行length() 函数时没有其他问题。感谢所有回答的人,这让我明白了我做得更好!

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多