我正在尝试实现一个方法,该方法返回特定索引处节点的索引。当元素存在时,我可以成功地检索索引;然而,如果没有,我会得到一个错误"NoneType"对象没有属性"data",我不太明白为什么会发生这种情况。这是我的链接列表和节点类
class Node:
def __init__(self,data = None,next = None):
self.data = data
self.next = next
class Listy:
def __init__(self):
self.head = None
这是我的get_index函数
def get_index(self,key):
temp = self.head
count = 0
while temp.data != key:
temp = temp.next
count += 1
print(count)
感谢您的帮助
您收到一个错误,因为您试图在while循环中获取'temp'的属性'data',但您的'temp'是'None',因为您将其分配给了'self.head',在列表为空的情况下,它实际上是'None]。我希望这是有意义的
根本原因是LinkedList的最后一个节点返回None,让我们稍微更改一下您的Listy类代码,以避免None值。
class Listy:
def __init__(self, nodes=None):
self.head = None
if nodes is not None:
node = Node(nodes.pop(0))
self.head = node
for elem in nodes:
node.next = Node(elem)
node = node.next
def get_index(self, key):
temp = self.head
count = 0
currentNode = temp.data
while temp is not None:
if count == key:
currentNode = temp.data
break
temp = temp.next
count += 1
return currentNode
让我们试着打电话给:
if __name__ == "__main__":
nodes = ["a", "b", "c"]
ll = Listy(nodes)
idx_1 = ll.get_index(0)
idx_2 = ll.get_index(1)
print(idx_1)
print(idx_2)
退货如下:
a
b
您的代码对查找键过于乐观:在查找值之前,它不会检查您是否已到达列表的末尾,因此temp
将变为None
,从而在计算temp.data
时导致异常。
因此,更改循环以确保temp
仍然不是None
,并且在找到密钥时返回索引(而不是打印(:
def get_index(self, key):
temp = self.head
count = 0
while temp:
if temp.data == key:
return count
temp = temp.next
count += 1
请注意,当找不到密钥时,它将如何返回None
。