Python----环形链表

一:环形链表

上次我们实现过单向链表了,今天我们来介绍一下环形链表。我们都知道,在单向链表中,头指针是非常重要的,如果头指针丢失了,整个链表就会遗失,链表所占用的内存空间也会浪费。如果我们将单向链表中的尾节点指向头结点,那么就会构成一个环形链表,在环形链表中,任何一个节点都可以作为头结点,也就没有头结点丢失这回事了。

二:构建链表


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个步骤进行:

  1. 创建新节点newnode
  2. newnode的下一个节点为头节点
  3. 头节点为newnode
  4. 寻找到尾节点,尾节点的下一个节点为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()

输出样例:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steven_moyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值