# encoding=utf-8
class Node(object):
"""节点类"""
def __init__(self, item):
"""
初始化函数
:param item: 要保存的用户数据
"""
self.item = item
self.next = None
class CycleSingleLinkList(object):
"""循环单链表"""
def __init__(self, node=None):
"""
初始化函数r
:param node: 可传可不传的头节点
"""
# 指向头节点
self.__head = node
def is_empty(self):
"""链表是否为空"""
return self.__head is None
def length(self):
"""链表长度"""
if self.is_empty():
return 0
current = self.__head
count = 1
while current.next != self.__head:
count += 1
current = current.next
return count
def travel(self):
"""遍历整个链表 要考虑空链表如果是空链表判断条件不成立也就不输出任何信息"""
if self.is_empty():
print("")
return
current = self.__head
while current.next != self.__head:
print(current.item, end=" ")
current = current.next
# 退出循环时游标指向了尾节点
print(current.item, end=" ")
print("") # 多输出换行
def add(self, item):
""""在链表头部插入元素"""
node = Node(item)
if self.is_empty():
node.next = node
self.__head = node
else:
cur = self.__head
# 寻找尾节点
while cur.next != self.__head:
cur = cur.next
node.next = self.__head
self.__head = node
cur.next = node
def append(self, item):
""""在链表尾部插入节点"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
node.next = self.__head
cur.next = node
def insert(self, pos, item):
"""指定位置添加元素"""
# 在头结点插入元素
if pos <=0:
self.add(item)
# 在链表的尾部添加元素
elif pos >= self.length():
self.append(item)
# 在链表的任意位置添加元素
else:
cur = self.__head
count = 0
# 找到添加位置的前一个位置
while count < (pos-1):
count += 1
cur = cur.next
node = Node(item)
node.next = cur.next
cur.next = node
def remove(self, item):
"""
删除节点
:param item: 要删除的元素
:return:
"""
if self.is_empty():
return
cur = self.__head
pre = None
while cur.next != self.__head:
# 找到了元素
if cur.item == item:
# 在头部找到了元素
if cur == self.__head:
rel = self.__head
while rel.next != self.__head:
rel = rel.next
self.__head = cur.next
rel.next = self.__head
else:
pre.next = cur.next
return
pre = cur
cur = cur.next
# 退出循环后, cur指向了尾节点
if cur.item == item:
if pre:
pre.next = self.__head
else:
# 链表只有一个节点
self.__head = None
def search(self, item):
"""
查找节点是否存在
:param item: 要查找的element
:return:
"""
cur = self.__head
while cur.next != self.__head:
if cur.item == item:
return True
cur = cur.next
# 退出循环后, cur指向了尾节点
if cur.item == item:
return True
return False
if __name__ == '__main__':
ll = CycleSingleLinkList()
print(ll.length())
ll.append(1) # 1
print(ll.length())
ll.travel()
ll.append(2) #1 2
print(ll.length())
ll.travel()
ll.add(3) # 3 1 2
ll.travel()
ll.add(4) # 4 3 1 2
ll.travel()
ll.insert(0, 5) # 5 4 3 1 2
ll.travel()
ll.insert(10, 6) # 5 4 3 1 2 6
ll.travel()
ll.insert(3, 7) # 5 4 3 7 1 2 6
ll.travel()
ll.remove(5) # 4 3 7 1 2 6)
ll.travel()
ll.remove(6) # 4 3 7 1 2
ll.travel()
ll.remove(7) # 4 3 1 2
ll.travel()
ll.remove(4) # 3 1 2
ll.travel()
ll.remove(3) # 1 2
ll.travel()
ll.remove(1) # 2
ll.travel()
ll.remove(2)
ll.travel()