【发布时间】: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