数据结构与算法-循环链表、双向链表

news2024/11/24 13:00:48

我们这里接着上一篇单链表继续往下深入学习循环链表、双向链表

链表

  • 🎈3.循环链表
    • 🔭3.1循环链表的概念
    • 🔭3.2循环链表的基本操作
      • 🔎3.2.1创建空表
      • 🔎3.2.2插入操作
      • 🔎3.2.3删除操作
  • 🎈4.双向链表
    • 🔭4.1类型定义
    • 🔭4.2头插法创建双向链表
    • 🔭4.3尾插法创建双向链表
    • 🔭4.4插入操作
    • 🔭4.5删除操作

🎈3.循环链表

🔭3.1循环链表的概念

循环链表是一种头尾相接的链表。它的特点是由链表的尾结点的指针域不为空,而是指向头结点,整个链表形成一个环。由此,从表中任何一个结点出发均可找到链表的其他结点。在单链表中,将终端结点的指针域NULL改为指向表头结点的或开始结点,就得到了单链形式的循环链表,并简称为单循环链表。与单链表一样,为了使空表和非空表处理一致,循环链表也可以设置一个头结点。空循环链表和非空循环链表如图所示:
在这里插入图片描述

🏆单循环链表的基本算法与非循环单链表的算法基本相同,只需对表尾的判断条件做出修改即可,例如,判断表尾结点的条件为:p->next==head.

🔭3.2循环链表的基本操作

在这里插入图片描述

🔎对于上述这个非空单循环链表:

✅当我们用头指针表示单循环链表:找a1的时间复杂度为:O(1),找an的时间复杂度为:O(n).
✅当我们用尾指针表示单循环链表:找a1的时间复杂度为:O(1)(R->next->next),找an的时间复杂度为:O(1)(R).
🏆因此,我们通常采用尾指针的单循环链表。

🔎3.2.1创建空表

void InitList(LNode *&rear)
{
	rear = new LNode;//创建头结点
	rear->next = rear;
}

🔎3.2.2插入操作

void InsertList(LNode *&rear, ElemType e)
{//在表尾插入一个结点
	LNode* s = new LNode;
	s->data = e;
	s->next = rear->next;
	rear->next = s;
	rear = s;
}

🔎3.2.3删除操作

void Delete(LNode*& rear, ElemType& e)
{//删除链表的第一个结点
	if (rear->next == rear)
		return;//空表,无法删除元素
	LNode* p = rear->next->next;//p指向第一个元素
	e = p->data;
	rear->next->next = p->next;
	if (p == rear)
		rear = p->next;
	delete p;
}

🎈4.双向链表

双向链表是在单链表的每一个结点里再增加一个指向其直接前驱的指针域prior,这样形成的链表有两个方向不同的链,故称为双向链表。
在这里插入图片描述

🔭4.1类型定义

typedef int ElemType;
typedef struct DNode
{
	ElemType data;//存放数据元素信息
	DNode* next;//存放后继结点的地址信息
	DNode* prior;//存放前驱结点的地址信息
}DNode;

🔭4.2头插法创建双向链表

void CreatList_h(DNode*& head, int n)
{
	DNode* s;
	head = new DNode;//创建头结点
	head->next = head->prior = NULL;//前后指针置为NULL
	int i = 0;
	for (i = 0; i < n; i++)//循环创建数据结点
	{
		s = new DNode;
		cin >> s->data;//读入数据
		s->next = head->next;//连接s的两个指针
		s->prior = head;
		if (head->next != NULL)
			head->next->prior = s;
		head->next = s;
	}
}

🔭4.3尾插法创建双向链表

void CreatList_t(DNode*& head, int n)
{
	DNode* s, * rear;
	head = new DNode;//创建头结点
	head->next = head->prior = NULL;//前后指针置为NULL
	rear = head;
	int i = 0;
	for (i = 0; i < n; i++)//循环创建数据结点
	{
		s = new DNode;//创建新的数据结点
		cin >> s->data;//读入数据
		s->prior = rear;//s插在rear后面
		rear->next = s;
		rear = s;
	}
	rear->next = NULL;
}

🔭4.4插入操作

在这里插入图片描述

void InsertDlist(DNode*& head, int i, ElemType e)
{
	int j = 0;//计数器
	DNode* p = head,*s;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)
		return;
	else//找到第i-1个结点
	{
		s = new DNode;
		s->data = e;
		s->next = p->next;//p结点后插入s结点
		s->prior = p;
		if (p->next)
			p->next->prior = s;
	}
}

🔭4.5删除操作

DeleteDList()函数在双向链表中,结点的删除操作涉及前驱结点和后继结点两个指针域的变化。设在双向链表中删除指针p所指向结点的后继结点q,需要修改两个指针域,删除操作指针变化过程如图所示:
在这里插入图片描述

void DeleteDList(DNode*& head, int i, ElemType& e)
{
	int j = 0;//计数器
	DNode* p = head, * q;
	while (p->next && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1)
		return;
	else
	{
		q = p->next;
		e = q->data;
		p->next = q->next;//删除q所指结点
		if (q->next != NULL)
			q->next->prior = p;
		delete q;
	}
}

好啦,关于循环链表和双向链表的知识点到这里就结束啦,后期会继续更新数据结构与算法的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1067548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图的存储-链式前向星

链式前向星 链式前向星是民间OI选手发明的数据结构。用另一个词解释它就是&#xff1a;用数组模拟的邻接链表。最核心的思想就是用数组模拟链表。 &#xff08;1&#xff09;前向星 前向星就是边的集合。一个图&#xff0c;只要将它的所有边存储起来&#xff0c;就能知道它的…

为什么append到父节点后的子节点发生修改,父节点打印出来的也会变化

今天走查前端代码&#xff0c;发现历史代码写出来的不规范&#xff0c;但是他还是在生产运行了很久的代码&#xff0c;仔细思量后发现&#xff0c;其实原理是对的&#xff0c;只是看起来不美观&#xff0c;不易读而已。 废话不说&#xff0c;先上demo代码 <!DOCTYPE html&g…

【Verilog 教程】7.1Verilog 除法器设计

除法器原理&#xff08;定点&#xff09; 和十进制除法类似&#xff0c;计算 27 除以 5 的过程如下所示&#xff1a; 除法运算过程如下&#xff1a; (1) 取被除数的高几位数据&#xff0c;位宽和除数相同&#xff08;实例中是 3bit 数据&#xff09;。 (2) 将被除数高位数据与…

实时选品系统实现的难点

实时选品系统是一个涉及到多个领域的复杂系统&#xff0c;需要兼顾数据挖掘和分析、推荐算法、机器学习、大数据处理等多方面的技术&#xff0c;才能实现高效、准确和可扩展的功能。 以下是实现实时选品系统时可能遇到的难点&#xff1a; 数据量大&#xff1a;实时选品系统需要…

无需公网IP,企业如何访问私有云?

企业的日常办公中已经习惯利用网盘或在线传输服务来进行文件传输和分享&#xff0c;面对一系列层出不穷的数据泄露和黑客行为&#xff0c;企业也越来越担心隐私泄露的问题&#xff0c;并寻找真正存储私有化的解决方案。某企业的总部在北京&#xff0c;在上海还有2处办公室&…

云服务器能干什么?腾讯云服务器的几十种玩法

腾讯云服务器价格很便宜尤其是轻量应用服务器&#xff0c;搞一台云服务器可以用来干嘛&#xff1f;云服务器的用途是很广的&#xff0c;现在轻量应用服务器2核2G3M、2核2G4M、4核8G12M等配置&#xff0c;百元的价格&#xff0c;买一台云服务器后可以做什么&#xff1f;拿来搭建…

PYTHON计算CPK及规范限合格率,绘制直方图概率密度曲线

CPK&#xff08;过程能力指数&#xff09;是一个用于衡量一个过程的稳定性和一致性的统计指标&#xff0c;特别用于制造业和质量管理中。它衡量了一个过程的变异性与规范界限的关系&#xff0c;帮助确定过程是否能够产生合格的产品或服务。 正态分布假设&#xff1a;CPK的计算…

多地智能停车场系统,如何实现数据互联互通?

某公司是从事嵌入式工控车牌自动识别系统、RFID蓝牙远距离读写系列、RFID电子标签系列、智能卡停车场、门禁一卡通智能管理系统、公务车派遣系统、运输车统计系统设备的开发、设计、制造、安装、调试及售后服务的企业。在智能卡停车场系统设备、人员通道闸设备方面有多项国家专…

通过Python脚本+Jekins实现项目重启

文章目录 一、需求二、分析三、实现公共代码单个服务版本1、写死某个服务2、支持服务单选 多服务版本最终实现效果将Python程序转换为桌面可执行文件&#xff08;.exe&#xff09; 一、需求 微服务项目&#xff0c;服务很多&#xff0c;重启服务&#xff0c;基本都是通过Jekin…

【微服务】RedisSearch 使用详解

目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶…

数学题目大合集 1

文章目录 建议这个题目集适合什么人?小剧场题目集M 题目 1算式法 1法 2M 题目 2算法分解质因数因数个数因数和因数积倒数和答M 题目 3算式解析HM 题目 4算式复习分解(利用“简单”数学)解析总结反馈建议 码字不易,还望关注点赞鼓励! 每个数学题目大合集都有 4 道题,题目…

【计算机网络】你真的懂学校的校园网吗?

【计算机网络】你真的懂学校的校园网吗&#xff1f; 第一步&#xff1a;从了解本机的ip开始 ip地址ip地址的分类公用地址和私有地址 查看本机ip 第二步&#xff1a;向上追溯&#xff0c;查看宿舍的路由器 路由器路由器的两个物理接口路由器用到的协议 分析宿舍路由器WAN口设置 …

linux系统篇(二).之Systemd机制

一、system介绍 systemd配置文件 systemd中这些资源分别代表着不同的单元&#xff08;Unit&#xff09;。systemd 总共有 11 种不同类型的“单元”。单元封装了与系统启动和维护相关的各种对象。systemd通过这些Unit的配置文件&#xff0c;知道怎么启动这些Unit。 提供以下单位…

为什么建议你考一个pmp项目管理证书?

先说一下&#xff0c;不是建议所有人考pmp&#xff0c;毕竟也不是所有人都做项目管理这一行&#xff0c;主要是项目管理人士&#xff08;PMI提出的pmp目标人群&#xff09;&#xff0c;大概如下几类&#xff1a; 项目小白&#xff0c;想进入项目管理行业&#xff0c;可在招聘上…

JDBC和GUI实现图书管理系统

1.介绍 主要通过gui页面实现了与mysql数据库实现交互,跟以前写的图书管理系统相比就是从存在集合中变成了存在数据库中. 下面我来介绍一下主要功能吧: 1.1.通过基本信息添加图书: 1.2.通过ID修改图书 1.3.通过ID查询图书 1.4.通过ID删除图书 2.构建数据库 2.1建库 …

深圳市重点实验室申报要求-华夏泰科

深圳市重点实验室&#xff0c;以开展基础研究、应用基础研究、前沿技术研究&#xff0c;培养人才、支撑产业和社会发展为目标而建立。它为研究人员提供了一个独特的平台&#xff0c;提供了一个展示他们创新性研究的舞台。本文将深入探讨如何申报深圳市重点实验室&#xff0c;为…

VS2022配置Opencv

配置环境变量 配置路径 由于新版本VS属性管理器没有Microsoft.cpp.x64.user文件&#xff0c;可以选择直接在Debug x64进行配置 配置包含目录和库目录 配置链接器

SpringCloud(三)Sentinel、Seata、多级缓存

文章目录 Sentinel雪崩问题Sentinel与Hystrixsentinel使用案例限流规则流控模式流控效果热点参数限流 隔离和降级Feign整合Sentinel线程隔离熔断降级 授权规则与规则持续化自定义异常结果规则管理模式 Seata分布式事务问题理论基础CAP定理BASE理论 Seata架构部署TC服务微服务集…

KylinOSv10系统k8s集群启动mysql5.7占用内存高的问题

问题现象 麒麟系统搭建k8s集群 mysql的pod启动失败 describe查看ommkill&#xff0c;放大limit资源限制到30G依旧启动失败 系统 报错信息 原因 内存占用太高 open_files_limit初始化太高 解决&#xff1a; 1、更换镜像 链接: https://pan.baidu.com/s/1b9uJLcc5Os0uDqD1e…

使用vue-cli创建vue3工程

PS&#xff1a;创建前先查看 vue/cli 版本&#xff0c;确保 vue/cli 版本在4.5.0以上 如果不是4.5.0以上版本&#xff0c;可以通过如下命令进行 安装/升级&#xff1a; npm install -g vue/cli 创建vue3工程步骤如下&#xff1a; 1. 创建项目&#xff1a; ①选择存放项目的…