在 python 链表中实现 __next__()
implementing __next__() in python linked list
我想通过迭代指定次数来检索链表中的特定节点;例如,检索第 4 个节点。通过实现 __iter__()
,我可以使用 for 循环进行迭代,但我不知道如何让 next()
函数工作。我已经注释掉了我对 next()
函数的尝试;当它留在里面时,我仍然得到 AttributeError: 'LinkedList' object has no attribute 'next'
编辑: 如果可能,我希望通过调用 next()
将 getNode(self, loc)
到 return 指定位置的节点。
这是节点和链表类:
class Node:
def __init__(self, data = None):
self.data = data
self.next = None
def __repr__(self):
return str(self.data)
class LinkedList:
def __init__(self, nodes = None):
self.head = None
if nodes is not None:
node = Node(data=nodes.pop(0))
self.head = node
for elem in nodes:
node.next = Node(data=elem)
node = node.next
def __repr__(self):
node = self.head
nodes = []
while node is not None:
nodes.append(str(node.data))
node = node.next
nodes.append("None")
return " -> ".join(nodes)
def __iter__(self):
node = self.head
while node is not None:
yield node
node = node.next
# def __next__(self):
# return self.next
def getNode(self,loc):
cnt = 0
for i in self:
if cnt < loc:
cnt += 1
else:
break
return i
ll = LinkedList([1,2,3,4,5])
print(ll)
print(ll.getNode(3))
for i in range(3):
print(ll.next())
[输出]
我
1 -> 2 -> 3 -> 4 -> 5 -> None
4个
追溯(最近一次通话最后一次):
File "/Users/jk/_python_source/misc_python/_mymisc/Leetcode work/LinkedList.py", line 53, in <module>
print(ll.next())
AttributeError: 'LinkedList' object has no attribute 'next'
您所做的工作比您必须做的要多得多。一旦您实现了 __iter__
,剩下的就水到渠成了。您可以使用它来实现几乎所有其他功能,例如 get_node
、__str__
或 __repr__
等
class Node:
def __init__(self, value):
self.value = value
self.next = None
def __str__(self):
return str(self.value)
class LinkedList:
def __init__(self):
self.head = None
def add(self, value):
if self.head is None:
self.head = Node(value)
else:
for cursor in self:
pass
cursor.next = Node(value)
return self
def get_node(self, node_index):
for index, node in enumerate(self):
if index == node_index:
break
else:
return None
return node
def __str__(self):
return " -> ".join(map(str, self))
def __iter__(self):
cursor = self.head
while cursor is not None:
yield cursor
cursor = cursor.next
ll = LinkedList().add(1).add(2).add(3)
print(ll)
for node_index in 0, 1, 2, 3:
print("The node at index {} is {}".format(node_index, ll.get_node(node_index)))
输出:
1 -> 2 -> 3
The node at index 0 is 1
The node at index 1 is 2
The node at index 2 is 3
The node at index 3 is None
>>>
这个getNode()
也有效:
def getNode(self,loc):
it = iter(self)
for i in range(loc):
next(it)
return next(it)
我想通过迭代指定次数来检索链表中的特定节点;例如,检索第 4 个节点。通过实现 __iter__()
,我可以使用 for 循环进行迭代,但我不知道如何让 next()
函数工作。我已经注释掉了我对 next()
函数的尝试;当它留在里面时,我仍然得到 AttributeError: 'LinkedList' object has no attribute 'next'
编辑: 如果可能,我希望通过调用 next()
将 getNode(self, loc)
到 return 指定位置的节点。
这是节点和链表类:
class Node:
def __init__(self, data = None):
self.data = data
self.next = None
def __repr__(self):
return str(self.data)
class LinkedList:
def __init__(self, nodes = None):
self.head = None
if nodes is not None:
node = Node(data=nodes.pop(0))
self.head = node
for elem in nodes:
node.next = Node(data=elem)
node = node.next
def __repr__(self):
node = self.head
nodes = []
while node is not None:
nodes.append(str(node.data))
node = node.next
nodes.append("None")
return " -> ".join(nodes)
def __iter__(self):
node = self.head
while node is not None:
yield node
node = node.next
# def __next__(self):
# return self.next
def getNode(self,loc):
cnt = 0
for i in self:
if cnt < loc:
cnt += 1
else:
break
return i
ll = LinkedList([1,2,3,4,5])
print(ll)
print(ll.getNode(3))
for i in range(3):
print(ll.next())
[输出] 我 1 -> 2 -> 3 -> 4 -> 5 -> None 4个 追溯(最近一次通话最后一次):
File "/Users/jk/_python_source/misc_python/_mymisc/Leetcode work/LinkedList.py", line 53, in <module>
print(ll.next())
AttributeError: 'LinkedList' object has no attribute 'next'
您所做的工作比您必须做的要多得多。一旦您实现了 __iter__
,剩下的就水到渠成了。您可以使用它来实现几乎所有其他功能,例如 get_node
、__str__
或 __repr__
等
class Node:
def __init__(self, value):
self.value = value
self.next = None
def __str__(self):
return str(self.value)
class LinkedList:
def __init__(self):
self.head = None
def add(self, value):
if self.head is None:
self.head = Node(value)
else:
for cursor in self:
pass
cursor.next = Node(value)
return self
def get_node(self, node_index):
for index, node in enumerate(self):
if index == node_index:
break
else:
return None
return node
def __str__(self):
return " -> ".join(map(str, self))
def __iter__(self):
cursor = self.head
while cursor is not None:
yield cursor
cursor = cursor.next
ll = LinkedList().add(1).add(2).add(3)
print(ll)
for node_index in 0, 1, 2, 3:
print("The node at index {} is {}".format(node_index, ll.get_node(node_index)))
输出:
1 -> 2 -> 3
The node at index 0 is 1
The node at index 1 is 2
The node at index 2 is 3
The node at index 3 is None
>>>
这个getNode()
也有效:
def getNode(self,loc):
it = iter(self)
for i in range(loc):
next(it)
return next(it)