数据结构-链表-环形链表

环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候可以在任一节点来遍历其他节点

  1. 环形链表的建立

    class student:def __init__(self):self.name = ''self.no = ''self.next = Nonehead = student()  #新增链表头元素ptr = head     #设置存放指针位置ptr.next = None       #目前没有下一个元素select = 0while select != 2:select = int(input('(1) 新增 (2) 离开 =>'))if select == 2:breakptr.name = input('姓名:')ptr.no = input('学号:')new_data = student()   #新增下一个元素ptr.next = new_data        #连接下一个元素new_data.next = None       #下一个元素的next先设置为Noneptr = new_data      #存取指针设置为新元素所在的位置
    
  2. 环形链表的遍历

    与单向链表的遍历十分相似,只不过单向链表的结束条件是ptr.next = None,而环形链表的结束条件是ptr.next = head

    ptr = head
    while True:print(ptr.name,ptr.no)ptr = ptr.next        #将head移到后一个元素if ptr.next == head:break
    
  3. 在环形链表中插入新节点

    因为环形链表中每一个元素指针都是指向一下个节点,所以没有所谓的从链表尾部插入的问题,通常只有两种情况:

    • 将新节点插在第一个节点前成为链表头部:首先将新节点x的指针指向原链表头节点,并遍历整个链表找到链表尾部,将它的指针指向新增节点,最后将链表表头指针指向新节点

      x.next = head
      CurNode = head
      while CurNode.next != head:CurNode = CurNode.next     #找到链表末尾后,将它的指针指向新增节点
      CurNode.next = x
      head = x       #将链表头指针指向新增节点
      
    • 将新节点x插在链表中任意节点I之后:首先将新节点X的指针指向I节点的下一节点,并将I节点的指针指向X节点

      X.next = I.next
      I.next = X
      
  4. 环形链表中删除节点

    环形链表的删除和插入方法类似,也可以分为两种情况

    • 删除环形链表的第一个节点:首先将链表头指针移到下一个节点,将最后一个节点的指针指向新的链表头部,新的链表头部就是原链表的第二个节点

      CurNode = head
      while CurNode.next != head:CurNode = CurNode.next     #找到最后一个节点
      TailNode = CurBode     #找到最后一个节点并记录下来
      head = head.next()     #将表头移动到一下个节点
      TailNode.next = head       #将最后一个节点指针指向新的链表头部
      
    • 删除环形链表的中间节点:首先找到节点Y前一个节点previous,将previous节点的指针指向节点Y的下一个节点

      CurNode = head
      while CurNode.next != delnode:CurNode = CurNode.next      #找到要删除节点的前一个节点
      PreNode = CurNode      #找到要删除节点的前一个节点并且记录下来
      CurNode = CurNode.next     #要删除的节点
      PreNode.next = CurNode.next        #将要删除节点的前一个指针指向要删除节点的下一个节点
      
      Previous DelNode NextNode
      要删除节点的前一个节点 要删除的节点 要删除节点的下一个节点

      代码目的:就是将Previous指针指向NextNode

  5. 环形链表的连接功能

    环形链表的连接并没有那么复杂,只需要改变两个指针就可以把两个环形链表连接在一起

    def concat(ptr1,ptr2):head = ptr1.next        #任意在ptr1中找到一个节点当做headptr1.next = ptr2.next     #任意在ptr2中找到一个节点,ptr1指向ptr2任意一个节点的下一个节点ptr2.next = head      #ptr2的下一个节点指向head(ptr1.next)return ptr2
    

数据结构-链表-环形链表相关推荐

  1. 图解Java数据结构之环形链表

    本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...

  2. 数据结构:单向环形链表

    约瑟夫问题 public class Josephus {public static void main(String[] args){SingleCircleLinkedList single = ...

  3. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  4. LeetCode-环形链表|+环形链表||

    环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起. 1.题 | 如下: 2.题目分析: 返回的是一个布尔型的结果,如果有环返回true,无环返回false. 3.源代码: bool ...

  5. 环形链表环形链表 II

    文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...

  6. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...

  7. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  8. 基础数据结构【四】————环形链表与多项式

    主要演示环形列表节点的创建插入, 删除,遍历,环形链表连接 .双向链表节点的建立与插入 ,双向链表中节点的删除 以及环形链表在多项式中的应用 DEMO1:环形链表节点的创建与插入 /* [名称]:ch ...

  9. 数据结构--环形链表

    环形链表的一种Go语言实现 package mainimport "fmt"//定义一个环形链表的节点结构体 type circleSingleLink struct {id in ...

最新文章

  1. logic.c:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘’ token...
  2. 信息化与工业化融合的内涵、层次和方向
  3. 拯救普通人周报焦虑,一个自动化报表工具就能实现
  4. fiddler无法抓取浏览器的https请求
  5. Java面试题总结(二)
  6. 即时通讯WebSocket
  7. win11卸载软件在哪里?
  8. Mac版Sublime Text3搭建c语言环境
  9. QT项目-“kun容道”
  10. Linux命令--lsof
  11. 2023年湖南中专单招报名流程
  12. 十四年磨一剑,万能数据库查询分析器7.024版本 发布
  13. 计算机开机启动过程详解
  14. R语言时间序列基础库zoo
  15. 阿里程序员不小心把服务器CPU打到100%,淡定展示教科书排查过程
  16. 基于STM32F103C8T6的HC-06蓝牙通信
  17. vb.net 教程 3-10 窗体编程 datagridview控件 3 禁止追加行 与 禁止删除行
  18. 【C++新手教程】C++ 循环
  19. 技术交流群,期待热爱技术的你加入
  20. 图像语义分割实践(二)数据增强与读取

热门文章

  1. [Java练习] 学生查询系统
  2. js两种滚动事件写法
  3. win10系统关闭哪些服务器,win10.1系统哪些服务可以关闭掉?
  4. PHPWAMP站点管理的“域名模式”和“端口模式”详解、均支持自定义
  5. EXCEL 2013中“定义名称”的命名规则
  6. 每日新闻早报简报十条和1条微语分享
  7. openwrt修改logo
  8. 编写一个Servlet,实现统计网站被访问次数的功能
  9. Unity 实现回血效果
  10. 反向寻车管理系统服务器,一种反向寻车系统及寻车方法