python 双向循环链表
程序员文章站
2024-03-06 09:23:25
...
class Node(object):
def __init__(self,pre=None,value=None,next=None):
self.pre = pre
self.value = value
self. next = next
class CircualDoubleLinkedlist(object):
def __init__(self, maxsize):
self.maxsise = maxsize
node = Node()
node.pre,node.next=node,node
self.root = node
self.length = 0
def __len__(self):
return self.length
def headnode(self):
return self.root.next
def tailnode(self):
return self.root.pre
def append(self,value):
if self.maxsise is not None and len(self)>self.maxsise:
raise Exception('FULL')
node = Node(value=value)
tail = self.tailnode()
tail.next = node
node.pre = tail
node.next = self.root
self.root.pre = node
self.length +=1
def appendleft(self,value):
if self.maxsise is not None and len(self)>self.maxsise:
raise Exception('FULL')
head = self.headnode()
n = Node(value=value)
self.root.next = n
n.next = head
n.pre = self.root
head.pre = n
self.length +=1 #not empty
def remove(self,node):
if node is self.root:
return
else:
node.pre.next = node.next
node.next.pre = node.pre
self.length -=1
return node
def __iter__(self):
for node in self.iter_node():
yield node.value
#for node in self.iter_node_reverse():
# yield node.value
def iter_node(self):
if self.root.next is self.root:
return
curnode = self.root.next
while curnode.next is not self.root:
yield curnode
curnode = curnode.next
yield curnode
def iter_node_reverse(self):
if self.root.next is self.root:
return
curnode = self.root.pre
while curnode.pre is not self.root:
yield curnode
curnode = curnode.pre
yield curnode
def testlist():
l = CircualDoubleLinkedlist(10)
l.append(0)
l.append(1)
l.append(2)
for i in l.iter_node_reverse():
print(i.value)
testlist()
今天和昨天开始做python实现的数据结构。。因为python有时候很不熟练加上数据结构忘记了很多==(吐槽一下自己开的太晚 之前练习的速度太慢)
总而言之,链表很简单 但是python迭代器还不太明白 不懂__iter__为什么要这么写:
def __iter__(self):
for node in self.iter_node():
yield node.value
明天学一下队列
上一篇: 导出MySQL数据与数据备份
下一篇: Java的绘图模式使用浅析