python单向循环链表原理与实现方法示例
本文实例讲述了python单向循环链表原理与实现方法。分享给大家供大家参考,具体如下:
单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
操作
- is_empty()判断链表是否为空
- length()返回链表的长度
- travel()遍历
- add(item)在头部添加一个节点
- append(item)在尾部添加一个节点
- insert(pos,item)在指定位置pos添加节点
- remove(item)删除一个节点
- search(item)查找节点是否存在
实现
#-*-coding:utf-8-*-
#!python3
classNode(object):
"""节点"""
def__init__(self,item):
self.item=item
self.next=None
classSinCycLinkedlist(object):
"""单向循环链表"""
def__init__(self):
self.__head=None
defis_empty(self):
"""判断链表是否为空"""
returnself.__head==None
deflength(self):
"""返回链表的长度"""
#如果链表为空,返回长度0
ifself.is_empty():
return0
count=1
cur=self.__head
whilecur.next!=self.__head:
count+=1
cur=cur.next
returncount
deftravel(self):
"""遍历链表"""
ifself.is_empty():
return
cur=self.__head
print(cur.item,)
whilecur.next!=self.__head:
cur=cur.next
print(cur.item,)
print("")
defadd(self,item):
"""头部添加节点"""
node=Node(item)
ifself.is_empty():
self.__head=node
node.next=self.__head
else:
#添加的节点指向_head
node.next=self.__head
#移到链表尾部,将尾部节点的next指向node
cur=self.__head
whilecur.next!=self.__head:
cur=cur.next
cur.next=node
#_head指向添加node的
self.__head=node
defappend(self,item):
"""尾部添加节点"""
node=Node(item)
ifself.is_empty():
self.__head=node
node.next=self.__head
else:
#移到链表尾部
cur=self.__head
whilecur.next!=self.__head:
cur=cur.next
#将尾节点指向node
cur.next=node
#将node指向头节点_head
node.next=self.__head
definsert(self,pos,item):
"""在指定位置添加节点"""
ifpos<=0:
self.add(item)
elifpos>(self.length()-1):
self.append(item)
else:
node=Node(item)
cur=self.__head
count=0
#移动到指定位置的前一个位置
whilecount<(pos-1):
count+=1
cur=cur.next
node.next=cur.next
cur.next=node
defremove(self,item):
"""删除一个节点"""
#若链表为空,则直接返回
ifself.is_empty():
return
#将cur指向头节点
cur=self.__head
pre=None
whilecur.next!=self.__head:
ifcur.item==item:
#先判断此结点是否是头节点
ifcur==self.__head:
#头节点的情况
#找尾节点
rear=self.__head
whilerear.next!=self.__head:
rear=rear.next
self.__head=cur.next
rear.next=self.__head
else:
#中间节点
pre.next=cur.next
return
else:
pre=cur
cur=cur.next
#退出循环,cur指向尾节点
ifcur.item==item:
ifcur==self.__head:
#链表只有一个节点
self.__head=None
else:
#pre.next=cur.next
pre.next=self.__head
defsearch(self,item):
"""查找节点是否存在"""
ifself.is_empty():
returnFalse
cur=self.__head
ifcur.item==item:
returnTrue
whilecur.next!=self.__head:
cur=cur.next
ifcur.item==item:
returnTrue
returnFalse
if__name__=="__main__":
ll=SinCycLinkedlist()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2,4)
ll.insert(4,5)
ll.insert(0,6)
print("length:",ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(7))
ll.remove(1)
print("length:",ll.length())
ll.travel()
运行结果:
length:6
6
2
1
4
3
5True
False
length:5
6
2
4
3
5
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。