前言
单向链表:链表之单向链表
循环链表是单向链表的变化形式。单向链表的尾部的指针域是空的,而循环链表的尾部指针是指向链表的头结点的,其结构如图一所示。
图
一
循
环
链
表
结
构
图一 循环链表结构
图一循环链表结构
从上面结构可以看出,循环链表的节点形成了一个圈。在进行遍历时,可以从任意节点开始。如果记录了尾部节点的话,循环链表的操作会方便很多,比如,可以实现O(1)时间的表头/表尾插入和O(1)时间的表头删除。
编程实现
(1) 功能
- is_empty() 链表是否为空
- length() 链表的长度
- scan() 遍历链表的节点
- add(item) 头部添加节点
- append(item) 在尾部添加节点
- insert(position,item) 中间插入节点
- remove(item)移除指定节点
- search(item) 查找是否存在包含该元素的节点
(2)代码实现
以下是以python实现的代码
class Node:
"""创建节点"""
def __init__(self, data):
self.data = data
self.next = None
class CycleLinkedList(object):
"""创建循环链表"""
def __init__(self, node=None):
self.rear = node
if node is not None:
self.rear.next = node
def is_empty(self):
"""链表是否为空"""
return self.rear == None
def length(self):
"""链表长度"""
if self.rear is None:
return 0
else:
count = 0
curNode = self.rear.next
while curNode:
count += 1
curNode = curNode.next
if curNode == self.rear.next:
return count
def add(self, item):
"""头部插入"""
"""保存了self.rear属性,使的找到头节点很方便"""
node = Node(item)
if self.is_empty():
self.rear = node
self.rear.next = node
else:
node.next = self.rear.next
self.rear.next = node
def append(self, item):
"""尾端插入"""
"""先执行前端插入,再执行尾部指针移动"""
self.add(item) # 头部插入
self.rear = self.rear.next # 将尾部指针移动到新添加的节点处
def insert(self, index, item):
""""索引是index,节点是第index+1个节点"""
if index <= 0:
self.add(item)
elif index > self.length() - 1:
self.append(item)
else:
node = Node(item)
curNode = self.rear.next # 找到头节点
count = 0
while count < index - 1:
curNode = curNode.next
count += 1
node.next = curNode.next
curNode.next = node
def remove(self, item):
"""移除节点"""
if self.is_empty():
return
else:
curNode = self.rear.next
precurNode = None
while curNode:
if curNode.data == item:
if curNode == self.rear.next: # 要删除的是头节点
self.rear.next = curNode.next
else:
precurNode.next = curNode.next
break
precurNode = curNode
curNode = curNode.next
def scan(self):
"""遍历链表"""
if self.rear is None:
return
curNode = self.rear.next # 通过尾部指针获取头节点
while curNode:
print(curNode.data, end=' ')
curNode = curNode.next
if curNode == self.rear.next:
return
def search(self, item):
curNode = self.rear.next
while curNode:
if curNode.data == item:
return True
curNode = curNode.next
if curNode.next == self.rear.next:
return
return False
# 测试代码
cl = CycleLinkedList()
cl.add(1)
cl.append(2)
cl.append(3)
cl.append(5)
cl.insert(3, 4)
cl.remove(5)
print(cl.search(3))
cl.scan()
运行结果如下:
从运行结果上看,代码运行正常,如有不合适之处,敬请指正,谢谢。