数据结构-链表-环形链表
数据结构-链表-环形链表
环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候可以在任一节点来遍历其他节点
环形链表的建立
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 #存取指针设置为新元素所在的位置
环形链表的遍历
与单向链表的遍历十分相似,只不过单向链表的结束条件是ptr.next = None,而环形链表的结束条件是ptr.next = head
ptr = head while True:print(ptr.name,ptr.no)ptr = ptr.next #将head移到后一个元素if ptr.next == head:break
在环形链表中插入新节点
因为环形链表中每一个元素指针都是指向一下个节点,所以没有所谓的从链表尾部插入的问题,通常只有两种情况:
将新节点插在第一个节点前成为链表头部:首先将新节点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
环形链表中删除节点
环形链表的删除和插入方法类似,也可以分为两种情况
删除环形链表的第一个节点:首先将链表头指针移到下一个节点,将最后一个节点的指针指向新的链表头部,新的链表头部就是原链表的第二个节点
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
环形链表的连接功能
环形链表的连接并没有那么复杂,只需要改变两个指针就可以把两个环形链表连接在一起
def concat(ptr1,ptr2):head = ptr1.next #任意在ptr1中找到一个节点当做headptr1.next = ptr2.next #任意在ptr2中找到一个节点,ptr1指向ptr2任意一个节点的下一个节点ptr2.next = head #ptr2的下一个节点指向head(ptr1.next)return ptr2
数据结构-链表-环形链表相关推荐
- 图解Java数据结构之环形链表
本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...
- 数据结构:单向环形链表
约瑟夫问题 public class Josephus {public static void main(String[] args){SingleCircleLinkedList single = ...
- java模拟单链表环形链表解决约瑟夫问题
java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...
- LeetCode-环形链表|+环形链表||
环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起. 1.题 | 如下: 2.题目分析: 返回的是一个布尔型的结果,如果有环返回true,无环返回false. 3.源代码: bool ...
- 环形链表环形链表 II
文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...
- 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表
[Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...
- java环形链表_数据结构和算法(四)Java实现环形链表
1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...
- 基础数据结构【四】————环形链表与多项式
主要演示环形列表节点的创建插入, 删除,遍历,环形链表连接 .双向链表节点的建立与插入 ,双向链表中节点的删除 以及环形链表在多项式中的应用 DEMO1:环形链表节点的创建与插入 /* [名称]:ch ...
- 数据结构--环形链表
环形链表的一种Go语言实现 package mainimport "fmt"//定义一个环形链表的节点结构体 type circleSingleLink struct {id in ...
最新文章
- logic.c:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘’ token...
- 信息化与工业化融合的内涵、层次和方向
- 拯救普通人周报焦虑,一个自动化报表工具就能实现
- fiddler无法抓取浏览器的https请求
- Java面试题总结(二)
- 即时通讯WebSocket
- win11卸载软件在哪里?
- Mac版Sublime Text3搭建c语言环境
- QT项目-“kun容道”
- Linux命令--lsof
- 2023年湖南中专单招报名流程
- 十四年磨一剑,万能数据库查询分析器7.024版本 发布
- 计算机开机启动过程详解
- R语言时间序列基础库zoo
- 阿里程序员不小心把服务器CPU打到100%,淡定展示教科书排查过程
- 基于STM32F103C8T6的HC-06蓝牙通信
- vb.net 教程 3-10 窗体编程 datagridview控件 3 禁止追加行 与 禁止删除行
- 【C++新手教程】C++ 循环
- 技术交流群,期待热爱技术的你加入
- 图像语义分割实践(二)数据增强与读取
热门文章
- [Java练习] 学生查询系统
- js两种滚动事件写法
- win10系统关闭哪些服务器,win10.1系统哪些服务可以关闭掉?
- PHPWAMP站点管理的“域名模式”和“端口模式”详解、均支持自定义
- EXCEL 2013中“定义名称”的命名规则
- 每日新闻早报简报十条和1条微语分享
- openwrt修改logo
- 编写一个Servlet,实现统计网站被访问次数的功能
- Unity 实现回血效果
- 反向寻车管理系统服务器,一种反向寻车系统及寻车方法