码迷,mamicode.com
首页 > 编程语言 > 详细

python 实现循环双端链表Circular_Double_Linked_List

时间:2019-03-16 23:16:03      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:lis   tail   turn   双端链表   roo   sse   range   app   except   

 1 class Node(object):
 2     
 3     def __init__(self, value=None):
 4         self.value = value
 5         self.next, self.prev = None, None
 6 
 7 class Circular_Double_Linked_List(object):
 8     
 9     def __init__(self, maxsize=None):
10         self.root = Node()
#我习惯于从空的链表开始就是个循环链表
11 self.root.next = self.root 12 self.root.prev = self.root 13 self.count = 0 14 self.maxsize = maxsize 15 16 def __len__(self): 17 return self.count 18 19 def append(self, value):
#这里的意思是如果maxsize不为None的前提下 len(self) >= self.maxsize
20 if self.maxsize is not None and len(self) >= self.maxsize: 21 raise Exception("Linked List Full") 22 node = Node(value) 23 tailnode = self.root.prev 24 tailnode.next = node 25 node.next = self.root 26 self.root.prev = node 27 node.prev = tailnode 28 self.count += 1 29 30 def append_left(self, value): 31 if self.maxsize is not None and len(self) >= self.maxsize: 32 raise Exception("Linked List Full") 33 headnode = self.root.next 34 node = Node(value) 35 self.root.next = node 36 node.next = headnode 37 headnode.prev = node 38 node.prev = self.root 39 self.count += 1 40 41 def iter_node(self): 42 curnode = self.root.next 43 while curnode is not self.root: 44 yield curnode 45 curnode = curnode.next 46 47 def __iter__(self): 48 for node in self.iter_node(): 49 yield node.value 50 51 def find(self, value): 52 for index,node in enumerate(self.iter_node()): 53 if node.value == value: 54 return index 55 return -1 56 57 def remove(self, node): 58 if node is self.root: 59 raise Exception(‘remove empty Liked List) 60 prevnode = node.prev 61 nextnode = node.next 62 prevnode.next = nextnode 63 nextnode.prev = prevnode 64 value = node.value 65 del node 66 self.count -= 1 67 return value
#这里也可以实现 O(1)操作的pop和popleft
def popleft(self):
        if self.root.next is self.root:
            raise Exception(pop from a empty linked list)
        headnode = self.root.next
        self.root.next = headnode.next
        headnode.next.prev = self.root
        value = headnode.value
        del headnode
        self.count -= 1
        return value
def pop(self):
        if self.root.next is self.root:
            raise Exception(pop from a empty linked list)
        tailnode = self.root.prev
        self.root.prev = tailnode.prev
        tailnode.prev.next = self.root
        value = tailnode.value
        del tailnode
        self.count -= 1
        return value
68     
69 if __name__ == "__main__":
70     cl = Circular_Double_Linked_List()
71     assert list(cl) == []
72     for i in range(5):
73         cl.append(i)
74     assert len(cl) == 5
75     assert list(cl) == [0, 1, 2, 3, 4]
76     assert cl.find(3) == 3
77     assert cl.find(5) == -1

 

python 实现循环双端链表Circular_Double_Linked_List

标签:lis   tail   turn   双端链表   roo   sse   range   app   except   

原文地址:https://www.cnblogs.com/python-zkp/p/10544858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!