python实现的循环双向链表

class doublelinked():
    def __init__(self, *args):
        self.__head = head = []
        self.__head += [None, head, head]
        self.__map = {}
        for i in args:
            self.append(i)

    # 插入到表尾
    def append(self, data):
        head = self.__head
        last = head[1]
        node = [data, last, head]
        head[1] = last[2] = self.__map[data] = node
        return node

    def prepend(self, data):
        head = self.__head
        last = head[2]
        node = [data, head, last]
        head[2] = last[1] = self.__map[data] = node
        return node

    def insertafter(self, node, data):
        next = node[2]
        n = [data, node, next]
        node[2] = next[1] = self.__map[data] = n
        return n

    def remove(self, node):
        data, prev, next = node
        prev[2] = next
        next[1] = prev
        node[1] = node[2] = node
        del self.__map[data]

    def removebydata(self, data):
        self.remove(self.__map[data])
    
    def __iter__(self):
        head = self.__head
        curr = head[2]
        while curr is not head:
            yield curr
            curr = curr[2]

    def __getitem__(self, data):
        return self.__map[data]

    def __reversed__(self):
        head = self.__head
        curr = head[1]
        while curr is not head:
            yield curr
            curr = curr[1]

    def __str__(self):
        return ", ".join([str(i[0]) for i in self])


dl = doublelinked('a','b')
dl.append('c')
dl.append('d')
dl.append('e')
dl.append('f')
print(dl)
print ("------------------")
dl.removebydata('b')
print(dl)

         采用一个固定有三个元素的list对象作为表结点机构,list对象的第一个元素是value,第二个元素是指向前一个表结点的引用(指针),第三个元素是指向后一个表结点的引用(指针),链表的头结点不存放数据,它作为一个哨兵,作为判断链表是否为空、链表遍历结束的标志。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
双向循环链表是一种链式数据结构,每个节点除了存储数据外,还有两个指针,分别指向前驱节点和后继节点。与单向链表相比,双向链表可以支持双向遍历和删除操作。 下面是用 Python 实现双向循环链表的代码: ```python class Node: def __init__(self, data): self.data = data self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None def is_empty(self): return self.head is None def add_first(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node new_node.prev = new_node new_node.next = new_node else: new_node.next = self.head new_node.prev = self.head.prev self.head.prev.next = new_node self.head.prev = new_node self.head = new_node def add_last(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node new_node.prev = new_node new_node.next = new_node else: new_node.prev = self.head.prev new_node.next = self.head self.head.prev.next = new_node self.head.prev = new_node def remove_first(self): if self.is_empty(): return None elif self.head.next is self.head: data = self.head.data self.head = None return data else: data = self.head.data self.head.next.prev = self.head.prev self.head.prev.next = self.head.next self.head = self.head.next return data def remove_last(self): if self.is_empty(): return None elif self.head.next is self.head: data = self.head.data self.head = None return data else: data = self.head.prev.data self.head.prev.prev.next = self.head self.head.prev = self.head.prev.prev return data def __str__(self): if self.is_empty(): return '[]' else: s = '[' node = self.head while node.next is not self.head: s += str(node.data) + ', ' node = node.next s += str(node.data) + ']' return s ``` 以上是基础的双向循环链表实现,你可以根据自己的需求,添加其他方法和属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__空无一人__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值