#定义节点
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()