DoubleLinkedList双向链表容器化
借助list
class SimplexNode:
def __init__(self,item,prev=None,post=None):
self.item=item
self.prev=None
self.post=None
def __repr__(self):
# return 'item: {} prev: {} post: {}'.format(self.item,str(self.prev),str(self.post))
return 'item: {}'.format(self.item)
class DoubleLinkedList:
def __init__(self,head=None,tail=None,size=0):
self.head=head
self.tail=tail
self.size=size
self.nodes=[]
def append(self,item):
node=SimplexNode(item)
if self.head is None:
self.head=node
else:
self.tail.post=node
node.prev=self.tail
self.tail=node
self.nodes.append(node)
def iternodes(self,reverse=False):
current=self.head if not reverse else self.tail
while current:
yield current
current=current.post if not reverse else current.prev
def insert(self,index,item): # implementation of position insertion
if index<0:
raise IndexError('{} is negative'.format(index))
datum=None # 记录插入位置的node
for i,node in enumerate(self.iternodes()):
if i==index:
datum=node
break
if datum is None: # index out of range OR instance is empty
self.append(item)
return
node=SimplexNode(item)
prev=datum.prev
if prev is None: # index==0
self.head=node
else:
# prev <=> node <=> datum
prev.post=node
node.prev=prev
node.post=datum
datum.prev=node
self.nodes.insert(index,node)
def pop(self):
if self.tail is None:
raise Exception('{} is emtpy!'.format(self))
datum=self.tail # 保存变量
prev=self.tail.prev
if prev is None: # self has one element
self.head=None
self.tail=None
else:
prev.post=None
self.tail=prev
self.nodes.pop()
del datum
return datum.item
def remove(self,index=0):
if self.tail is None:
raise Exception('{} is empty!'.format(self))
if index<0:
raise IndexError('{} is negative!'.format(index))
datum=None
for i,node in enumerate(self.iternodes()):
if i==index:
datum=node
break
if datum is None:
raise IndexError('{} out of range'.format(index))
# prev <=> datum <=> post
prev=datum.prev
post=datum.post
if prev is None and post is None: # self has one element
self.head=None
self.tail=None
elif prev is None: # index==0
post.prev=None
self.head=post
elif post is None:
prev.post=None
self.tail=prev
else:
prev.post=post
post.head=prev
del datum
self.nodes.pop(index)
def __len__(self):
return len(self.nodes)
def __getitem__(self,item):
return self.nodes[item]
def __setitem__(self,key,value):
# self.nodes[key].item=value
self[key].item=value
def __iter__(self,reverse=False): # 需要生成器对象,无法传递参数
return self.iternodes(reverse=False)
b=DoubleLinkedList()
for m in range(5):
b.append(m)
print(b.nodes)
b.insert(1,88)
# b.remove()
b[1]=999
for m in b.iternodes(reverse=False):
print(m)
for m in b:
print(m)
# bb=DoubleLinkedList()
# bb.pop()
NoList
from functools import partial
class SimplexNode:
def __init__(self,item,prev=None,post=None):
self.item=item
self.prev=None
self.post=None
def __repr__(self):
# return 'item: {} prev: {} post: {}'.format(self.item,str(self.prev),str(self.post))
return 'item: {}'.format(self.item)
class DoubleLinkedList:
def __init__(self,head=None,tail=None,size=0):
self.head=head
self.tail=tail
self.size=size
self.nodes=[]
def append(self,item):
node=SimplexNode(item)
if self.head is None:
self.head=node
else:
self.tail.post=node
node.prev=self.tail
self.tail=node
self.size+=1
self.nodes.append(node)
def iternodes(self,reverse=False):
current=self.head if not reverse else self.tail
while current:
yield current
current=current.post if not reverse else current.prev
def insert(self,index,item): # implementation of position insertion
if index<0:
raise IndexError('{} is negative'.format(index))
datum=None # 记录插入位置的node
for i,node in enumerate(self.iternodes()):
if i==index:
datum=node
break
if datum is None: # index out of range OR instance is empty
self.append(item)
return
node=SimplexNode(item)
prev=datum.prev
if prev is None: # index==0
self.head=node
else:
# prev <=> node <=> datum
prev.post=node
node.prev=prev
node.post=datum
datum.prev=node
self.size+=1
self.nodes.insert(index,node)
def pop(self):
if self.tail is None:
raise Exception('{} is emtpy!'.format(self))
datum=self.tail # 保存变量
prev=self.tail.prev
if prev is None: # self has one element
self.head=None
self.tail=None
else:
prev.post=None
self.tail=prev
self.nodes.pop()
self.size-=1
return datum.item
def remove(self,index=0):
if self.tail is None:
raise Exception('{} is empty!'.format(self))
if index<0:
raise IndexError('{} is negative!'.format(index))
datum=None
for i,node in enumerate(self.iternodes()):
if i==index:
datum=node
break
if datum is None:
raise IndexError('{} out of range'.format(index))
# prev <=> datum <=> post
prev=datum.prev
post=datum.post
if prev is None and post is None: # self has one element
self.head=None
self.tail=None
elif prev is None: # index==0
post.prev=None
self.head=post
elif post is None:
prev.post=None
self.tail=prev
else:
prev.post=post
post.head=prev
self.size-=1
del datum
self.nodes.pop(index)
def __len__(self):
return len(self.nodes)
def __len__(self):
length=0
datum=self.head
while datum:
length+=1
datum=datum.post
return length
def __len__(self):
return self.size
def __getitem__(self,item):
return self.nodes[item]
def __getitem__(self,item):
datum=None
for i,node in enumerate(self.iternodes()):
if i==item:
datum=node
break
if datum is None:
raise IndexError('{} out of range'.format(item))
return datum.item
def __getitem__(self,item):
datum=None
for i,node in enumerate(self.iternodes(False if item>=0 else True),0 if item>=0 else 1):
if i==abs(item):
datum=node
break
if datum is None:
raise IndexError('{} out of range'.format(item))
return datum.item
def __setitem__(self,key,value):
# self.nodes[key].item=value
self[key].item=value
def __setitem__(self,key,value):
datum=None
for i,node in enumerate(self.iternodes()):
if i==key:
datum=node
break
if datum is None:
raise IndexError('linked list assignment index out of range')
datum.item=value
def __iter__(self,reverse=False): # 需要生成器对象,无法传递参数
return self.iternodes(reverse=False)
__iter__ = iternodes
# __iter__ = partial(iternodes,reverse=True)
b=DoubleLinkedList()
for m in range(5):
b.append(m)
print(b.nodes)
# b.insert(1,88)
# b.remove()
# b[1]=999
b.pop()
b[2]=777
for m in b.iternodes(reverse=False):
print(m)
for m in b:
print(m)
print(len(b))
print(b[-1])
print(b[3])
# bb=DoubleLinkedList()
# bb.pop()
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律