# 链表中的相关操作
# 单向循环链表,
class Node(object):
# 单链表结点
def __init__(self, elem):
self.elem = elem
self.next = None
class SingleCycleLinkList(object):
# 单向循环链表
def __init__(self, node=None):
self.__head = node
if node:
node.next = node
def is_empty(self):
# 判断链表是否为空
return self.__head is None
def length(self):
# 链表长度
if self.is_empty():
return 0
cur = self.__head
cnt = 1
while cur.next is not self.__head:
cnt += 1
cur = cur.next
return cnt
def travel(self):
# 遍历整个列表
if self.is_empty():
return
cur = self.__head
while cur.next is not self.__head:
print(cur.elem, end=' ')
cur = cur.next
# 当循环结束后,cur指向尾结点,但尾结点未打印,
print(cur.elem)
def add(self, item):
# 链表头不添加元素
# 有两种插入方法
# (1): 先把 node 插入
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
return
node.next = self.__head
# self.__head = node # 此方法有问题, 在 add() 添加了结点后会覆盖原链表
# cur = node
cur = self.__head
while cur.next is not node.next:
cur = cur.next
# 退出循环后 cur 指向的是尾结点
cur.next = node
self.__head = node
def add_2(self, item):
# (2): 先遍历找到 尾结点
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
# 如果是空链表,此时 node.next 指向自身
return
cur = self.__head
while cur.next is not self.__head:
cur = cur.next
# 退出循环后 cur 指向的是尾结点
node.next = self.__head
self.__head = node
cur.next = node
def append(self, item):
# 链表尾部添加元素
node = Node(item)
# if self.__head == None:
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not self.__head:
cur = cur.next
cur.next = node
node.next = self.__head
def insert(self, pos, item):
# 指定位置添加元素
# :param pos 从0开始
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
cur = self.__head
cnt = 1
while cnt != pos:
cnt += 1
cur = cur.next
# 当循环退出后 pre 指向pos - 1
node.next = cur.next
cur.next = node
def remove(self, item):
# 删除节点
if self.is_empty():
return
cur = self.__head
pre = None
while cur.next is not self.__head:
if cur.elem == item:
# 先判断此节点是否为头节点
if cur == self.__head:
# 头节点的情况 如果要删除头结点就要改变尾结点的指向
# 找到尾结点
rear = self.__head
while rear.next is not self.__head:
rear = rear.next
# 循环结束后 rear 指向尾结点
self.__head = cur.next
rear.next = cur.next
else:
# 中间结点
pre.next = cur.next
return
else:
pre, cur = cur, cur.next
# 循环退出后 cur 指向尾结点,但此时没经过处理,
if cur.elem == item:
if cur == self.__head:
# 处理只有一个结点
self.__head = None
else:
# 处理尾结点
pre.next = cur.next
# pre.next = self.__head
else:
return
def search(self, item):
# 查找节点是否存在
if self.is_empty():
return False
cur = self.__head
res = False
while cur.next is not self.__head :
if cur.elem == item:
res = True
break
else:
cur = cur.next
# 退出循环时 cur 指向尾结点, 但是没有经过判断
if cur.elem == item:
# 判断尾结点是否对应 item
res = True
return res
if __name__ == "__main__":
ll = SingleCycleLinkList()
print(ll.is_empty())
print(ll.length())
ll.add(1)
ll.travel()
ll.append(2)
ll.travel()
print(ll.length())
ll.add(0)
print(ll.is_empty())
print(ll.length())
ll.travel()
python 线性表——单向循环链表
最新推荐文章于 2023-07-26 09:08:13 发布