双向-->带头-->循环链表
目录
一、双向带头循环链表概述
1.什么是双向带头循环链表
2.双向带头循环链表的优势
3.双向带头循环链表简图
二、双向带头循环链表的增删查改图解及代码实现
1.双向带头循环链表的头插
2.双向带头循环链表的尾插
3.双向带头循环链表的头删
4.双向带头循环链表的尾删
5.双向带头循环链表在pos位置前插入节点
6.双向带头循环链表删除pos位置节点
一、双向带头循环链表概述
1.什么是双向带头循环链表
双向:每个节点都带有一个指向下一个节点的指针(next)和一个直向前一个节点的指针(prev);
带头:即链表带有哨兵位头节点,该节点只包含两个指针,不存储有效数据;
循环:哨兵位头节点有一个next指针指向第一个有效数据节点,还有一个prev指针指向哨兵位节点的前一个节点即链表的尾节点,因此实现了链表的循环;
双向带头循环链表的节点类型:
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;
2.双向带头循环链表的优势
双向带头循环链表不需要我们遍历每个节点来找尾节点,对于链表的尾插而言就变得非常简单。由于较单向非循环链表而言,双向带头循环链表多了一个指向前一个节点的指针prev,所以在结构上较为复杂,但实际应用中少了很多的麻烦。
3.双向带头循环链表简图

二、双向带头循环链表的增删查改图解及代码实现
1.双向带头循环链表的头插
示意图:

代码实现:
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* First = pHead->next;NewNode->next = First;First->prev = NewNode;NewNode->prev = pHead;pHead->next = NewNode;
}
2.双向带头循环链表的尾插
示意图:

代码实现:
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* Tail = pHead->prev;NewNode->prev = Tail;Tail->next = NewNode;NewNode->next = pHead;pHead->prev = NewNode;
}
3.双向带头循环链表的头删
示意图:

代码实现:
// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* First = pHead->next;ListNode* Next = First->next;pHead->next = Next;Next->prev = pHead;free(First);First = NULL;
}
4.双向带头循环链表的尾删
示意图:

代码实现:
// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* Tail = pHead->prev;ListNode* Prev = Tail->prev;Prev->next = pHead;pHead->prev = Prev;free(Tail);Tail = NULL;
}
5.双向带头循环链表在pos位置前插入节点
示意图:

代码实现:
// 双向链表在pos位置的前面插入节点
void ListInsert(ListNode* pos, LTDataType x)
{ListNode* NewNode = Node_New(x);ListNode* Prev = pos->prev;Prev->next = NewNode;NewNode->prev = Prev;NewNode->next = pos;pos->prev = NewNode;
}
6.双向带头循环链表删除pos位置节点
示意图:

代码实现:
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{ListNode* Prev = pos->prev;ListNode* Hind = pos->next;Prev->next = Hind;Hind->prev = Prev;free(pos);pos = NULL;
}
相关文章:
双向-->带头-->循环链表
目录 一、双向带头循环链表概述 1.什么是双向带头循环链表 2.双向带头循环链表的优势 3.双向带头循环链表简图 二、双向带头循环链表的增删查改图解及代码实现 1.双向带头循环链表的头插 2.双向带头循环链表的尾插 3.双向带头循环链表的头删 4.双向带头循环链表的尾删…...
Opencv4基于C++基础入门笔记:OpenCV环境配置搭建
文章目录: 一:软件安装 二:配置环境(配置完之后重启一下软件) 1.配置电脑系统环境变量 vs2012及其以下 vs2014及其以上 2.配置VS软件环境变量 vs2012及其以下 vs2014及其以上 三:测试 vs2012及其…...
JS基础之实现map方法
提示:内容虽少,但是里面也有好几个知识点。 step 1:实现函数 function mapTmp (fn){if(!Array.isArray(this) || !this?.length) return [];const arr [];this.forEach((item, index) > {const newItem fn(item, index, this);arr.pu…...
FPGA应用学习笔记-----复位电路(二)和小结
不可复位触发器若和可复位触发器混合写的话,不可复位触发器是由可复位触发器馈电的。 不应该出现的复位,因为延时导致了冒险,异步复位存在静态冒险 附加素隐含项,利用数电方法,消除静态冒险 这样多时钟区域还是算异步的…...
信捷 XD PLC 16位整数转换为双精度浮点数
完成16位整数转换为双精度浮点数,信捷XD PLC需要两个指令,逐步转换,一个指令搞不定。 具体的: 第1步:int16->int32 第2步:int32->Double 例子,比如说将D0转换成浮点数放到D100~D103...
(二)结构型模式:1、适配器模式(Adapter Pattern)(C++实现示例)
目录 1、适配器模式(Adapter Pattern)含义 2、适配器模式应用场景 3、适配器模式的UML图学习 4、C实现适配器模式的示例 1、适配器模式(Adapter Pattern)含义 将一个接口转换为客户端所期待的接口,从而使两个接口…...
【编程二三事】ES究竟是个啥?
在最近的项目中,总是或多或少接触到了搜索的能力。而在这些项目之中,或多或少都离不开一个中间件 - ElasticSearch。 今天忙里偷闲,就来好好了解下这个中间件是用来干什么的。 ES是什么? ES全称ElasticSearch,是个基于Lucen…...
爬虫逆向实战(三)--天某云登录
一、数据接口分析 主页地址:天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密? 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密? 无…...
不要过于迷恋软件架构,要重视如何设计根据简单和清晰的设计
1. 设计一个计算机系统的目标应该是简单性 。 系统越简单,理解起来就越简单,找到问题就越简单,实现它就越简单。描述的语言越清晰,设计就越容易理解。 干净的设计类似于干净的代码:它易于阅读且易于理解。 2. 如何编…...
Grafana监控 Redis Cluster
Grafana监控 Redis Cluster 主要是使用grafana来实现监控,grafana可以对接多种数据源,在官网中可以找到Redis数据源,需要安装redis data source插件。当然也可以利用Prometheus来做数据源,下面分别记录一下这两种数据源的安装配置…...
k8s 认证和权限控制
k8s 的认证机制是啥? 说到 k8s 的认证机制,其实之前咋那么也有提到过 ServiceAccouont ,以及相应的 token ,证书 crt,和基于 HTTP 的认证等等 k8s 会使用如上几种方式来获取客户端身份信息,不限于上面几种…...
性能优化的重要性
性能优化的重要性 性能优化的重要性摘要引言注意事项代码示例及注释性能优化的重要性 性能优化的重要性在 Java 中的体现响应速度资源利用效率扩展性与可维护性并发性能合理的锁策略线程安全的数据结构并发工具类的应用避免竞态条件和死锁 总结代码示例 博主 默语带您 Go to Ne…...
Leetcode No.53 Maximum Subarray
参考资料: 考点:子串 & 动态规划 & [题干] Input: nums [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.1. 心路历程 这道题非常经典,蕴含的思想也是精巧无比。 2. 正解 简单来说官…...
手机出现 不读卡 / 无信号时应该怎么办?
当手机屏幕亮起,一般在屏幕最上方都会有代表手机卡状态的显示,其中网络信号和读卡状态的标识,依旧有很多人分不太清,更不清楚改怎么办了。 1、当我们的手机里有两张卡时,则会有两个信号显示 2、信号状态一般是由短到…...
Linux 内核模块运行机制(10/11)
Linux 内核实现了一个比较酷的功能:支持模块的动态加载和运行。如果你实现了一个内核模块并打算运行它,你并不需要重启系统,直接使用 insmod 命令加载即可,这个模块就像补丁一样打进了 Linux 操作系统,并可以正常运行。…...
MySQL数据库-字符串函数详解
前言 MySQL数据库提供了多种不同类型的函数,用于处理字符串、日期、数值等数据类型,以及实现条件、聚合等操作,下面我们主要介绍字符串函数 CONCAT() 函数 CONCAT() 可用于将多个字符串连接在一起。 示例: SELECT CONCAT(Hell…...
半导体退火那些事(3)
4.半导体退火设备 双腔全自动兼容6-8寸快速退火炉RTP 产地:中国 型号: S803 特点: 室温到1250C,应用于SiC,GaN等第三代半导体领域 简介 (Description) S803系列自动快速退火炉,内置Robot可以自动取放片,适用于最大8英寸 (单片200m…...
1281. 整数的各位积和之差
诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 简单粗暴的遍历2. 其实也是遍历,但是用Python内置函数只用写一行 1. 简单粗暴的遍历 Python版: class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…...
如何使用Vue和C++实现OJ《从零开始打造 Online Judge》
课程简介 课程链接:https://www.lanqiao.cn/courses/20638 邀请码:x8pGd60V 本课程采用前后端分离架构,基于 Vue.js 和 C 技术,从零开始打造 Online Judge。 课程介绍 OJ 是 Online Judge 系统的简称,用来在线检测…...
在Spring Boot和Vue中实现请求过滤器以验证请求头中的Token
在Spring Boot应用程序中创建一个过滤器类,用于处理请求: Component public class AuthenticationFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
【学习记录】Office 和 WPS 文档密码破解实战
文章目录 📌 引言📁 Office 与 WPS 支持的常见文件格式Microsoft Office 格式WPS Office 格式 🛠 所需工具下载地址(Windows 官方编译版)🔐 破解流程详解步骤 1:提取文档的加密哈希值步骤 2&…...
