一、基础知识
1.循环链表:将单链表中终端结点的指针由空指针改为指向头结点,得单循环链表
2.与单链表相比得区别:主要是循环条件,由判断p.next !=None变为p.next != head。
3.优势:在循环链表中访问尾结点可以直接通过尾指针访问,而不需要每次访问都进行一次循环,时间复杂度为O(1),在需要频繁访问尾结点时效率更高。
4.注意:循环链表中需要保存尾指针。
二、定义在循环链表上的操作
class Node(object):
'''初始化结点'''
def __init__(self, data,next = None):
self.data = data
self.next = next
class CircularLinkList(object):
def __init__(self,data):
self.header = Node(None)
self.tail = None
if data != None:
self.CreateListTail(data)
def CreateListTail(self,data):
'''创建循环链表'''
for i in data:
node = Node(i)
if self.header.next == None:
self.header.next = node
node.next = self.header
self.tail = node
else:
current_node = self.header
while current_node.next != self.header:
current_node = current_node.next
node.next = current_node.next
current_node.next = node
self.tail = node
#与单链表创建的不同之处在于,需要将末端结点的指针指向头结点,并设置一个尾指针tail指向末端节点
def is_impty(self):
'''判空'''
if self.header.next == None:
return True
else:
return False
def get_lenth(self):
'''获取循环链表长度'''
current_node = self.header
count = 0
while current_node.next != self.header:
current_node = current_node.next
count+=1
return count
#注意循环的判断条件为current_node.next != self.header,而不是current_node.next != None
def traverse(self):
'''遍历循环链表'''
current_node = self.header.next
while current_node != self.header:
print(current_node.data)
current_node = current_node.next
#与单链表方式类似,注意循环结束判断
def getelem(self,index):
'''获取循环链表中的数据'''
current_node = self.header
if (index<=0 or index>self.get_lenth()):
print('Error')
else:
for i in range(1,index):
current_node = current_node.next
elem = current_node.next.data
return elem
def ListInsert(self,value,index):
'''在循环链表中指定位置插入数据'''
if (index<=0 or index>self.get_lenth()+1):
print('Error')
else:
current_node = self.header
node = Node(value)
if index == 1:
node.next = self.header.next
self.header.next = node
elif index == self.get_lenth()+1:
self.InsertFromTail(value)
else:
for i in range(1,index):
current_node = current_node.next
node.next = current_node.next
current_node.next = node
#注意在末尾插入,见如下InsertFromTail
def ListDelete(self,index):
if (index<=0 or index>self.get_lenth()):
print('Error')
else:
current_node = self.header
if index == 1:
delete_node = self.header.next
self.header.next = delete_node.next
elif index == self.get_lenth():
self.DeleteFromTail()
else:
for i in range(1,index):
current_node = current_node.next
delete_node = current_node.next
current_node.next = delete_node.next
##注意在末尾删除,见如下DeleteFromTail
def InsertFromTail(self,value):
'''循环链表尾部插入数据'''
node = Node(value)
node.next = self.tail.next
self.tail.next = node
self.tail = node
#与单链表插入数据方法相同,只是需要保存新的尾指针
def DeleteFromTail(self):
'''删除循环链表最后一个数据'''
current_node = self.header
while current_node.next.next != self.header:
current_node = current_node.next
delete_node = current_node.next
current_node.next = delete_node.next
self.tail = current_node
#与单链表删除数据方法相同,只是需要保存新的尾指针
def MergeList(self,otherlist):
'''合并循环链表'''
p = self.tail.next
self.tail.next = otherlist.tail.next.next
q = otherlist.tail.next
otherlist.tail.next = p
self.tail = otherlist.tail
return self
三、参考
1.《大话数据结构》第三章 线性表