一:环形链表
上次我们实现过单向链表了,今天我们来介绍一下环形链表。我们都知道,在单向链表中,头指针是非常重要的,如果头指针丢失了,整个链表就会遗失,链表所占用的内存空间也会浪费。如果我们将单向链表中的尾节点指向头结点,那么就会构成一个环形链表,在环形链表中,任何一个节点都可以作为头结点,也就没有头结点丢失这回事了。
二:构建链表
2.1:节点类
# 节点类
class Student:
def __init__(self,SchNum,name):
self.SchNum = SchNum
self.name = name
self.next = None
2.2:链表类
构造函数
在环形链表中,我们仍然有头尾节点,只不过tail.next不是None了而已,tail.next=head。
# 环形链表类
class CirCleLink:
def __init__(self,index):
self.head = Student(0,'初始化链表'+str(index))
self.tail = self.head
self.size = 1
添加节点
# 添加节点
def add(self,SchNum,name):
stu = Student(SchNum,name)
self.tail.next = stu
self.tail = stu
self.tail.next = self.head
self.size = self.size + 1
插入节点到链表头部
这里我们分为3个步骤进行:
- 创建新节点newnode
- newnode的下一个节点为头节点
- 头节点为newnode
- 寻找到尾节点,尾节点的下一个节点为newnode
# 插入节点到链表头部
def insert_to_head(self,SchNum,name):
stu = Student(SchNum,name)
stu.next = self.head # 新节点的next为头节点
pre = self.head
while(pre.next != self.head): # 寻找尾节点
pre = pre.next
pre.next = stu # 尾节点的next为新节点
self.head = stu # 新节点为头节点
self.size = self.size + 1
插入节点到头节点以外的地方
# 插入节点到除head以外处
def insert_to_other(self,SchNum,name,index):
insert_stu = Student(SchNum,name)
stu = self.head
for i in range(index - 1):
stu = stu.next
insert_stu.next = stu.next
stu.next = insert_stu
self.size = self.size + 1
删除头节点
# 删除头部节点
def delete_head(self):
self.head = self.head.next
self.tail.next = self.head
删除头节点以外的节点
pre:deletenode的前一个节点
pcur:deletenode的后一个节点
# 删除除head以外的节点
def delete_others(self,index):
stu = self.head
for i in range(index - 1):
stu = stu.next
pre = stu
deletenode = stu.next
pre.next = deletenode.next
遍历环形链表的所有数据
# 遍历环形链表所有数据
def get_all_data(self):
stu = self.head
while(True):
print(stu.SchNum,stu.name)
if(stu.next == self.head):
break
else:
stu = stu.next
链接两个环形链表
# 链接两个环形链表
def concat(self,cl2):
self.tail.next = cl2.head
cl2.tail.next = self.head
self.tail = cl2.tail
示例代码
# 节点类
class Student:
def __init__(self,SchNum,name):
self.SchNum = SchNum
self.name = name
self.next = None
# 环形链表类
class CirCleLink:
def __init__(self,index):
self.head = Student(0,'初始化链表'+str(index))
self.tail = self.head
self.size = 1
# 添加节点
def add(self,SchNum,name):
stu = Student(SchNum,name)
self.tail.next = stu
self.tail = stu
self.tail.next = self.head
self.size = self.size + 1
# 插入节点到链表头部
def insert_to_head(self,SchNum,name):
stu = Student(SchNum,name)
stu.next = self.head # 新节点的next为头节点
pre = self.head
while(pre.next != self.head): # 寻找尾节点
pre = pre.next
pre.next = stu # 尾节点的next为新节点
self.head = stu # 新节点为头节点
self.size = self.size + 1
# 插入节点到除head以外处
def insert_to_other(self,SchNum,name,index):
insert_stu = Student(SchNum,name)
stu = self.head
for i in range(index - 1):
stu = stu.next
insert_stu.next = stu.next
stu.next = insert_stu
self.size = self.size + 1
# 删除头部节点
def delete_head(self):
self.head = self.head.next
self.tail.next = self.head
# 删除除head以外的节点
'''
pre:deletenode的前一个节点
pcur:deletenode的后一个节点
'''
def delete_others(self,index):
stu = self.head
for i in range(index - 1):
stu = stu.next
pre = stu
deletenode = stu.next
pre.next = deletenode.next
# 遍历环形链表所有数据
def get_all_data(self):
stu = self.head
while(True):
print(stu.SchNum,stu.name)
if(stu.next == self.head):
break
else:
stu = stu.next
# 链接两个环形链表
def concat(self,cl2):
self.tail.next = cl2.head
cl2.tail.next = self.head
self.tail = cl2.tail
def main():
cl = CirCleLink(0);
cl.add(1,1)
cl.add(2,2)
cl.add(3,3)
print('--------------function add-----------------')
cl.get_all_data()
# 创建链表2
cl2 = CirCleLink(2)
cl2.add(4,4)
cl2.add(5,5)
print('-------------function concat-----------------')
cl.concat(cl2)
cl.get_all_data()
# 插入(100,100)到头部
print('---------function insert_to_head-----------')
cl.insert_to_head(100,100)
cl.get_all_data()
# 插入(5000,5000)到中间
print('---------function insert_to_others----------')
cl.insert_to_other(1000,1000,3)
cl.get_all_data()
# 删除头部
print('----------function delete_head--------------')
cl.delete_head()
cl.get_all_data()
# 删除(1000,1000)
print('-----------function delete_others-----------')
cl.delete_others(2)
cl.get_all_data()
if __name__ == '__main__':
main()
输出样例: