如何解决链表结构中的迭代问题
我的__iter__()
实现对链表结构有问题。我想在不使用yield
和iter()
的情况下实现它。
使用一个循环可以很好地工作,但是当我添加一个嵌套循环时,外部循环仅迭代一次,并在内循环完成后退出:
class LinkedList:
class Node:
def __init__(self,data,next=None):
self.data,self.next = data,next
def __init__(self,seq=None):
self.head = self.tail = None
self.extend(seq)
self.current = self.head
def __iter__(self):
return self
def __next__(self):
if not self.current:
raise StopIteration
else:
temp = self.current.data
self.current = self.current.next
return iter(self.current)
def extend(self,seq):
for val in reversed(seq):
node = self.Node(val,self.head)
if self.tail is None:
self.tail = node
self.head = node
ll = LinkedList(range(10,101,10))
for val in ll:
for val2 in ll:
print((val,val2))
这会产生错误的输出:
(10,20)(10,30)(10,40)(10,50)(10,60)(10,70)(10,80)(10,90)(10,100)>
虽然我希望还会得到第一个值为20、30等的元组。
解决方法
像这样的嵌套循环的问题:
ll = LinkedList([1,2,3,4])
for val in ll:
for val2 in ll:
print((val,val2))
...对于嵌套循环,您将拥有相同的迭代器实例,即链表本身,它仅具有一个current
属性。因此,当内部循环完成时,current
将为None
,然后外部循环将调用__next__
,仅发现current
是None
。这样就退出了。
您需要在return self
函数中离开__iter__
。相反,您应该每次调用__iter__
时返回唯一的
因此专门为此目的定义一个类。
注意:__next__
实现的最后一行也有一个错误:它应该返回temp
。
class LinkedList:
class Iterator:
def __init__(self,current):
self.current = current
def __next__(self):
if not self.current:
raise StopIteration
else:
temp = self.current.data
self.current = self.current.next
return temp # <-- correction
class Node:
def __init__(self,data,next=None):
self.data,self.next = data,next
def __init__(self,seq=None):
self.head = self.tail = None
self.extend(seq)
self.current = self.head
def __iter__(self):
return self.Iterator(self.head) # <--- new instance!
def extend(self,seq):
for val in reversed(seq):
self.head = self.Node(val,self.head)
if self.tail is None:
self.tail = self.head
# now the nested iteration works...
ll = LinkedList([1,val2))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。