单链表 的一个变形是单向循环链表,链表中最后一个节点的next域指向链表的头结点
操作
- is_empty() 判断链表是否为空
- length() 返回链表的长度
- travel() 遍历
- add(item) 在头部添加一个节点
- append(item) 在尾部添加一个节点
- insert(pos, item) 在指定位置pos添加节点
- remove(item) 删除一个节点
- search(item) 查找节点是否存在
实现
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): # 判断链表长度
if self.is_empty():
return 0
count = 1
cur = self._head
while cur.next != self._head:
count += 1
cur =cur.next
return count
def travel(self): # 遍历链表
if self.is_empty():
return
cur = self._head
print(cur.item)
while cur.next != self._head:
cur = cur.next
print(cur.item)
print("")
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 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, pos, item): # 指定节点添加
if pos < 0:
self.add(item)
elif pos > (self.length()-1):
self.append(item)
else:
node = Node(item)
cur = self._head
count = 0
while count < (pos - 1):
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
def remove(self, item): #删除 一个节点
if self.is_empty():
return
cur = self._head
pre = None
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
def search(self, item): # 查找结点
if self.is_empty():
return False
cur = self._head
if cur.item == item:
return True
while cur.next != self._head:
cur = cur.next
if cur.item == item:
return True
return False
l1 = SinCycLinkedlist()
l1.add(1)
l1.add(2)
l1.append(3)
l1.insert(2, 4)
l1.insert(4, 5)
l1.insert(0, 6)
print("l1.length", l1.length())
print("-----------")
l1.travel()
print("-----------")
print(l1.search(3))
print(l1.search(7))
l1.remove(1)
print("length--------")
print(l1.length())
print("travel----------")
l1.travel()