python 链表 + 迭代器

class MyLinkedList:
    """
    双向链表
    """
    class Node:
        def __init__(self, data, prev=None, next=None):
            self.data = data
            self.prev = prev
            self.next = next

    def __init__(self):
        """
        有头的双向链表
        """
        self.__size = 0
        self._head = self.Node("head")
        self._tail = self.Node("tail")
        self._head.next = self._tail
        self._tail.prev = self._head

    @property
    def size(self):
        return self.__size

    def append(self, data):
        node = self.Node(data)
        # 保存尾结节的前一个节点
        prev = self._tail.prev
        # 关联前节点和新节点
        prev.next = node
        node.prev = prev
        # 关联尾节点和新节点
        self._tail.prev = node
        node.next = self._tail
        # 计数+1
        self.__size += 1

    def get(self, index):
        if index >=0 and index <self.__size:
            i = 0
            node = self._head
            while i<=index:
                node = node.next
                i += 1
            return node
        else:
            raise IndexError

    def __iter__(self):
        """
        在调用for-in或iter()时,会执行此方法
        :return:
        """
        self.count = 0
        return self

    def __next__(self):
        while self.count < self.__size:
            node = self.get(self.count)
            self.count += 1
            return node
        raise StopIteration


if __name__ == '__main__':
    mll = MyLinkedList()

    for x in range(3):
        mll.append(f"data {x}")

    print(mll.size)

    # 使用for-in遍历迭代器
    for i in mll:
        print(i.data)

    # 初始化迭代器
    it = iter(mll)
    while True:
        try:
            print(next(it).data)
        except StopIteration:
            break
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值