我正在构建一个双向链表,我正在努力在PYTHON中构造一个双向链表迭代器方法.
到目前为止这是我的代码
class DoubleListNode:
def __init__(self,data):
self.data=data
self.prev = None
self.next= None
class ListIterator:
def __init__(self):
self._current = self.head
def __iter__(self):
return self
def next(self):
if self.size == 0 :
raise StopIteration
else:
item = self._current.data
self._current=self._current.next
return item
class DoublyLinkedList:
def __init__(self):
self.head= None
self.tail= None
self.size = 0
def add(self,data):
newnode= DoubleListNode(data)
self.size+=1
if self.head is None:
self.head = newnode
self.tail = self.head
elif data < self.head.data: # before head
newnode.next = self.head
self.head.prev= newnode
self.head= newnode
elif data > self.tail.data: # at the end
newnode.prev= self.tail
self.tail.next= newnode
self.tail=newnode
else:
curNode = self.head
while curNode is not None and curNode.data < data:
curNode=curNode.next
newnode.next= curNode
newnode.prev=curNode.prev
curNode.prev.next= newnode
curNode.prev=newnode
def remove(self,data):
curNode=self.head
while curNode is not None and curNode.data!= data:
curNode= curNode.next
if curNode is not None:
self.size -= 1
if curNode is self.head:
self.head= curNode.next
else:
curNode.prev.next=curNode.next
if curNode is self.tail:
self.tail=curNode.prev
else:
curNode.next.prev=curNode.prev
Run Code Online (Sandbox Code Playgroud)
当我进行测试时,它说TypeError: iteration over non-sequence.我做错什么了吗 ?
我认为有两件重要的事情需要解决。
首先,你的DoublyLinkedList类没有__iter__方法。您可能想要创建一个返回ListIterator实例的实例。也许您正在尝试手动执行此操作,但这将是正常方法。
其次,您需要修复代码ListIterator才能正常工作。目前,您的__init__方法无法正确初始化事物,并且您的next方法尝试访问size不存在的成员变量。
这是我认为可行的实现:
def ListIterator(object):
def __init__(self, node):
self.current = node
def __iter__(self):
return self
def next(self):
if self.current is None:
raise StopIteration()
result = self.current.data
self.current = self.current.next
return result
class DoublyLinkedList(object):
# all your current stuff, plus:
def __iter__(self):
return ListIterator(self.head)
Run Code Online (Sandbox Code Playgroud)
附带说明一下,在您当前的代码中,您正在定义没有基数的类。这在 Python 3 中很好(object默认情况下是基类),但在 Python 2 中这将导致获得“旧式”类。旧式类已被弃用,您会发现某些语言功能无法与它们一起正常工作(尽管据我所知,迭代中涉及的任何功能都不是)。另一方面,如果您已经在使用 Python 3,那么您需要__next__在迭代器类中定义一个方法,而不是next(不带下划线)。