Python循环链表
Python循环链表
链表:把数据通过“指针”连接起来,并标记一个head起点,方便增删改查
python链表类
#定义节点Node
class Node():
def __init__(self,item):
#数据域
self.item=item
#"指针"域
self.next=None
#定义链表
class Cyclelinkedlist():
#链表长度大小
size=0
def __init__(self):
self.head=None
def is_empty(self):
return self.head is None
def length(self):
return self.size
#链表元素索引从0开始
def insert(self,index,item):
if index<0 or index>self.size:
print("out of range")
return
#插入头节点,由于是循环链表,则需要找到尾节点
if index==0:
#判空,刚开始创建链表,链中没有元素,self.head为Node,curr也为Node,无法进行下一个判断
if self.is_empty():
node=Node(item)
self.head=node
self.head.next=self.head
else:
#定义游标节点
curr=self.head
#找到尾节点
while curr.next != self.head:
curr=curr.next
#新建节点
node=Node(item)
node.next=self.head
curr.next=node
#更新头节点
self.head=node
else:
#pre为要插入位置的前一个
pre=self.head
for i in range(index-1):
pre=pre.next
node=Node(item)
#curr为要插入节点位置
curr=pre.next
node.next=curr
pre.next=node
#长度自增一
self.size+=1
#尾插法
def append(self,item):
#直接调用insert函数
self.insert(self.size,item)
# curr=self.head
# while curr.next!=self.head:
# curr=curr.next
# node=Node(item)
# node.next=self.head
# curr.next=node
# # 长度自增一
# self.size+=1
def remove(self,index):
if index<0 or index>self.size:
print("out of range")
return
#去除头节点,(麻烦一点,因为不仅要去除,而且还要更新头节点)
if index==0:
#找到尾节点
curr=self.head
while curr.next!=self.head:
curr=curr.next
#保存头结点的下一个
temp=self.head.next
#删除头节点
curr.next=self.head.next
#更新头节点
self.head=temp
#删除的不是头节点
else:
#找到要删除节点的前一个结点(前驱节点)
pre=self.head
for i in range(index-1):
pre=pre.next
#要删除节点temp
curr=pre.next
pre.next=curr.next#等价于pre.next=pre.next.next
#长度自减一
self.size-=1
def update(self,index,item):
if index<0 or index>self.size:
print("out of range")
return
curr=self.head
for i in range(index):
curr=curr.next
curr.item=item
def find(self,index):
curr=self.head
for i in range(index):
curr=curr.next
return curr.item
#与items()方法
def out(self):
curr=self.head
# #注意最后一个值不会被打印,
# while curr.next!=self.head:
# print(curr.item,end=' ')
# curr=curr.next
# print()
for i in range(self.size):
print(curr.item,end=' ')
curr=curr.next
print()
if __name__=='__main__':
l=Cyclelinkedlist()
for i in range(10):
l.insert(i,i*10)
l.out()
#0 10 20 30 40 50 60 70 80 90
l.update(0,1314)
l.out()
#1314 10 20 30 40 50 60 70 80 90
print(l.find(0))
#1314
l.update(6,666)
l.out()
#1314 10 20 30 40 50 666 70 80 90
l.append(520)
l.out()
#1314 10 20 30 40 50 666 70 80 90 520