class Node(object):
"""链表节点"""
def __init__(self,data,next=None):
self.data = data
self.next = next
class SingleCycleList(object):
"""单向循环链表"""
def __init__(self,node = None):
if node == None:
self.__head = None
else :
self.__head = node
self.__head.next=node
def getLastNode(self):
"""返回单向循环链表的最后一个元素"""
if not self.__head:
return None
else:
last = self.__head
while last.next != self.__head:
last = last.next
return last
def insert(self,index,data):
"""在指定位置插入元素"""
node = Node(data)
#如果链表为空,直接在表头插入
if self.__head == None:
self.__head = node
self.__head.next = node
else:
curLen = self.get_length()
if index < 0 or index > curLen:
print('输入的插入位置不合法,请重新输入!当前列表长度为: %d',curLen)
return
#遍历链表得到第Index个元素
if index == 0:
last = self.getLastNode()
node.next = self.__head
self.__head = node
last.next = self.__head
else:
curIndex = 0
cur = self.__head
while curIndex < index-1:
cur = cur.next
curIndex+=1
#第index位置插入元素
cur.next,node.next = node,cur.next
def append(self,data):
"""尾部插入元素"""
# 构造一个Node示例并将它添加到链表末尾
node = Node(data)
#遍历链表,获取最后一个元素
if self.__head == None:
self.__head = node
self.__head.next=node
else:
last = self.__head
while last.next != self.__head:
last = last.next
last.next ,node.next= node,self.__head
def insert_front(self,data):
"""链表头插入元素"""
#构造一个Node实例
node = Node(data)
if self.__head == None:
self.__head = node
self.__head.next=node
else:
last = self.getLastNode()
self.__head,node.next = node,self.__head
#修改最后一个元素的next指向
last.next = self.__head
def get_length(self):
"""获得链表长度"""
cur = self.__head
if not cur:
return 0
len = 1
while cur.next != self.__head:
len+=1
cur = cur.next
return len
def travle(self):
"""遍历单项链表"""
cur = self.__head
print('---开始遍历单向链表----')
while cur != None:
print(cur.data, end=",")
if cur.next == self.__head:
break
cur = cur.next
print('\n---结束遍历单向链表----')
def is_empty(self):
"""判断列表是否为空"""
return self.__head == None
def seach(self,data):
"""查找某个元素是否在列表中存在"""
is_find = False
cur = self.__head
while cur != None:
if cur.data == data:
is_find = True
break
elif cur.next == self.__head:
break
else:
cur = cur.next
return is_find
def remove(self,data):
"""查找列表中是否存在某个元素,如果存在则删除"""
cur = self.__head
previous = cur = self.__head
isHead = True
while cur != None:
if cur.data == data:
if isHead:
last = self.getLastNode()
self.__head = cur.next
last.next = self.__head
else:
previous.next = cur.next
break
else:
previous = cur
cur = cur.next
isHead = False
if __name__=='__main__':
sll = SingleCycleList()
# print(sll.is_empty())
# print(sll.get_length())
sll.append(1)
sll.append(2)
sll.insert_front(0)
sll.insert_front(-1)
sll.insert(0,-2)
sll.insert(5,4)
sll.insert(5,3)
sll.insert(0,-3)
print(sll.is_empty())
print(sll.get_length())
sll.travle()
print(sll.seach(0))
print(sll.seach(5))
sll.travle()
sll.remove(0)
sll.travle()
sll.remove(-3)
sll.travle()
sll.remove(4)
sll.travle()