MonoLinkedList & duobleLinkedList
class SimplexNode:
def __init__(self,value,post=None,prev=None):
self.value=value
self.post=post
self.prev=prev
def __repr__(self):
# return 'Node: {}'.format(self.value)
return str(self.value)
# def __str__(self):
# return 'Node: {}'.format(self.value)
class MonoLinkedList:
def __init__(self):
self.nodes=[]
self.head=None
self.tail=None
def __len__(self):
return len(self.nodes)
def append(self,value):
node=SimplexNode(value)
prev=self.tail
if prev:
prev.post=node
else:
self.head=node
self.nodes.append(node)
self.tail=node
def iternodes(self,rervser=False):
current=self.head
if current:
while current:
# yield current.value
yield current
current=current.post
else:
raise SystemError('Empty!')
b=MonoLinkedList()
b.append(SimplexNode('bb'))
b.append(SimplexNode('pp'))
for p in b.iternodes():
print(p)
print(len(b))
class SimplexNode:
def __init__(self,value,post=None):
self.value=value
self.post=post
def __repr__(self):
return repr('value: {}'.format(self.value))
class MonoLinkedList:
def __init__(self):
self.head=None
self.tail=None
self.size=0
def add(self,value):
node=SimplexNode(value)
if self.head is None:
self.head=node
else:
self.tail.post=node
self.tail=node
def iternodes(self):
current=self.head
while current:
yield current
current=current.post
paw=MonoLinkedList()
paw.add('bnm')
paw.add(1)
paw.add(2)
paw.add('uiop')
print(paw.head,paw.tail)
for b in paw.iternodes():
print(b)
class SimplexNode:
def __init__(self,value,prev=None,post=None):
self.value=value
self.prev=prev
self.post=post
def __repr__(self):
return str(self.value)
def __str__(self):
return 'nodeValue: {}'.format(self.value)
class DoubleLinkedList:
def __init__(self): # 初始化默认只产生空双向链表
self.head=None
self.tail=None
def append(self,value):
node=SimplexNode(value)
if self.head is None:
self.head=node
else:
self.tail.post=node
node.prev=self.tail
self.tail=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 pop(self): # version one
# pop从尾部操作,故以尾部为基准,tail,prev出栈后被GC回收
if self.tail is None:
raise Exception('Empty LinkedList!')
tail=self.tail
prev=tail.prev
if prev is None: # 只有一个元素 head==tail,有很多判断方式,以尾部为基准
self.head=None
self.tail=None
else:
prev.post=None # 只有一个node时,prev为None
self.tail=prev
return tail.value
def getitem(self,index):
if index<0:
return None
current=None
for i,item in enumerate(self.iternodes()):
if i==index:
current=item
break
if current is not None:
return current
def insert(self,index,value):
if index<0:
raise Exception('Index is negative!')
current=None
for i,item in enumerate(self.iternodes()):
if i==index:
current=item
break
if current is None:
self.append(value)
return
prev=current.prev # 待插入对象的前置对象
node=SimplexNode(value) # 待插入对象
if prev is None: # i==index==0第一个元素的情况
self.head=node
node.post=current
current.prev=node
return
# prev <=> node <=> current
prev.post=node
node.prev=prev
node.post=current
current.prev=node
# Signature: list.pop(self,index=-1,/)
# Docstring:
# Remove and return item at index (default last)
# Raises IndexError if list is empty or index is out of range
def pop(self,index=None): # simulate list.pop
def _pop(): # for the last item scenario
tail=self.tail
prev=tail.prev
if prev is None: # one itme scenario
self.head=None
self.tail=None
else: # multi item scenario
prev.post=None
self.tail=prev
return tail
if self.tail is None: # List is empty
raise IndexError('Index out of range!')
if index is None:
return _pop()
else:
if index==0: # 第一个item
current=self.head
post=current.post
self.head=post
post.prev=None
current.post=None
return current
current=None # 待移除item
for i,node in enumerate(self.iternodes()):
if i==index:
current=node
if current is None: # 索引超界
raise IndexError('Index out of range!')
if i==index: # 最后一个item
return _pop()
else: # prev <=> current <=> post 中间item的pop
prev=current.prev
post=current.post
prev.post=post
post.prev=prev
current.prev=None
current.post=None
return current
pat=DoubleLinkedList()
for b in range(4):
pat.append(b)
for b in pat.iternodes(reverse=True):
print(b)
# print(pat.getitem(0))
print('*'*40+'insert method'+'*'*40)
pat.insert(1,88)
pat.insert(1,99)
pat.insert(100,'bnm')
pat.insert(0,'uiop')
for b in pat.iternodes():
print(b)
print('~'*40+'pop method'+'~'*40)
print(pat.pop(3))
# print(pat.pop(0))
print('$'*60)
for b in pat.iternodes():
print(b)
class SimplexNode:
def __init__(self,value,prev=None,post=None):
self.value=value
self.prev=None
self.post=None
def __repr__(self):
return repr(self.value)
class DoubleLinkedList:
def __init__(self):
self.head=None
self.tail=None
self.size=0
def append(self,value):
node=SimplexNode(value)
if self.head is None:
self.head=node
else:
self.tail.post=node
node.prev=self.tail
self.tail=node
def insert(self,index,value):
if index<0:
raise ValueError('Index {} out of range!'.format(index))
current=None
for i,node in enumerate(self.iternodes()):
if i==index:
current=node
break
if current is None:
self.append(value)
return
node=SimplexNode(value)
prev=current.prev
if prev is None: # head node
self.head=node
else:
prev.post=node
node.prev=prev
node.post=current
current.prev=node
def pop(self):
if self.tail is None:
raise Exception('{} Empty'.format(self))
tail=self.tail
prev=tail.prev
if prev is None: # one item scenario
self.head=None
self.tail=None
else:
prev.post=None
tail.prev=None
self.tail=prev
return tail.value
def remove(self,index):
if index<0:
raise ValueError('Index {} is negative'.format(index))
if self.tail is None:
raise Exception('Empty!')
current=None
for i,node in enumerate(self.iternodes()):
if i==index:
current=node
break
if current is None:
raise ValueError('Index {} out of range!'.format(index))
prev=current.prev
post=current.post
if prev is None and post is None: # one item scenario
self.head=None
self.tail=None
elif prev is None:
self.head=post
post.prev=None
elif post is None:
self.tail=prev
prev.post=None
else:
prev.post=post
post.prev=prev
del current
def iternodes(self,reverse=False):
current=self.tail if reverse else self.head
while current:
yield current
current=current.prev if reverse else current.post
pat=DoubleLinkedList()
pat.append('bnm')
for b in range(1,6):
pat.append(b)
pat.append('uiop')
print(pat.head,pat.tail)
for p in pat.iternodes(True):
print(p)
print('$'*60)
pat.remove(6)
pat.remove(5)
for p in pat.iternodes():
print(p)
pat.insert(3,5)
pat.insert(20,'vbn')
pat.insert(8,20)
【推荐】国内首个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 绘制太阳,地球,月球 运作规律