双向链接列表迭代器python

Tom*_*Ngo 5 python

我正在构建一个双向链表,我正在努力在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.我做错什么了吗 ?

Blc*_*ght 2

我认为有两件重要的事情需要解决。

首先,你的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(不带下划线)。