单向循环链表的特性: 尾部指针不为None,指向循环的额下一个元素的head
class Node(object):
"""节点"""
def __init__(self, item):
self.item = item
self.next = None
class SinCycLinkedlist(object):
"""单向循环链表"""
def __init__(self):
self._head = None
def is_empty(self):
"""判断链表是否为空"""
return self._head == None
def length(self):
"""返回链表的长度"""
# 如果链表为空,返回长度0
if self.is_empty():
return 0
cur = self._head
count = 0
while cur.next != self._head:
count += 1
cur = cur.next
def add(self, item):
"""向单链表头部添加节点"""
node = Node(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
node.next = self._head
cur = self._head
while cur.next != self._head:
cur = cur.next
cur.next = node
self._head = node
def travel(self):
"""遍历单链表"""
if self.is_empty():
return None
else:
cur = self._head
print(cur.item)
while cur.next != self._head:
cur = cur.next
print(cur.item)
def append(self, item):
"""向单链表尾部添加节点"""
node = Node(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
cur = self._head
while cur.next != self._head:
cur = cur.next
cur.next = node
node.next = self._head
def insert(self, item, pos):
"""向单链表指定位置添加节点"""
node = Node(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.next = cur.next
cur.next = node
def search(self, item):
"""查找单链表中的节点"""
if self.is_empty():
return None
cur = self._head
if cur.item == item:
return
while cur.next != self._head:
cur = cur.next
if cur.item == item:
return True
return False
def remove(self, item):
"""删除单链表指定节点"""
# 删除 删除时把指定删除的值 的前一位的next指向下一位的head
if self.is_empty():
return None
cur = self._head
if cur.item == item:
# 在头部第一个数字就是
if cur.next != self._head:
# 有多个节点
while cur.next != self._head:
cur = cur.next
cur.next = self._head.next
self._head = self._head.next
else:
# 链表只有一个节点
self._head = None
else:
pre = self._head
while cur.next != self._head:
if cur.item == item:
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
if cur.item == item:
pre.next = cur.next
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()