04数据结构与算法_双端链表(闭环)_Python实现

本文深入探讨了双端链表的概念,并详细介绍了如何使用Python实现闭环双端链表。通过实例代码,阐述了双端链表的插入、删除、遍历等操作,同时讲解了闭环特性在特定场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#定义节点
class Node(object):
    def __init__(self,prev=None,value=None,next=None):
        self.prev,self.value,self.next = prev,value,next

#定义双端列表
class CircualDoubleLinkedList(object):
    def __init__(self,max_size=None):
        self.max_size = max_size
        node = Node()
        #根节点自己指向自己,即实现了一个闭环
        node.next,node.prev = node,node
        self.root = node
        self.length = 0       #root不计算在长度里面

    def __len__(self):
        return self.length

    def head_node(self):
        """获得头节点"""
        return self.root.next

    def tail_node(self):
        """获取尾节点"""
        return self.root.prev

    def append(self,value):
        """在尾部添加方法"""
        #判断是否超过最大长度
        if self.max_size is not None and self.length > max_size:
            raise Exception("The CircualDoubleLinkedList is Full!")
        node = Node(value=value)
        tail_node = self.tail_node()

        tail_node.next = node
        node.prev = tail_node
        node.next = self.root
        self.root.prev = node

        self.length += 1


    def append_left(self,value):
        """在头部添加方法"""
        if self.max_size is not None and self.length > max_size:
            raise Exception("The CircualDoubleLinkedList is Full!")

        node = Node(value=value)

        if self.root.next is self.root:     #空环
            node.next = self.root
            node.prev = self.root
            self.root.next = node
            self.root.prev = node
        else:
            node.prev = self.root
            head_node = self.head_node()
            node.next = head_node
            head_node.prev = node
            self.root.next = node

        self.length += 1


    def remove(self,node):      #O(1)复杂度,注意这里传入的是node
        """删除元素方法"""
        if node is self.root:
            return
        else:
            node.prev.next = node.next
            node.next.prev = node.prev
        self.length -= 1
        return node

    def iter_node(self):
        """遍历方法"""
        if self.root.next is self.root:
            return
        curr_node = self.root.next
        while curr_node.next is not self.root:
            yield curr_node
            curr_node = curr_node.next
        yield curr_node

    def __iter__(self):
        for node in self.iter_node():
            yield node.value

    def iter_node_rev(self):
        """反向遍历方法"""
        if self.root.prev is self.root:
            return
        curr_node = self.root.prev
        while curr_node.prev is not self.root:
            yield curr_node
            curr_node = curr_node.prev
        yield curr_node

def test_CircualDoubleLinkedList():

    dll = CircualDoubleLinkedList()
    assert len(dll) == 0

    dll.append(0)
    dll.append(1)
    dll.append(2)
    assert len(dll) == 3

    assert [node.value for node in dll.iter_node()] == [0,1,2]
    assert [node.value for node in dll.iter_node_rev()] == [2,1,0]

test_CircualDoubleLinkedList()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值