数据结构入门 — 链表详解_双向链表
前言
数据结构入门 — 双向链表详解*
博客主页链接:https://blog.csdn.net/m0_74014525
关注博主,后期持续更新系列文章
文章末尾有源码
*****感谢观看,希望对你有所帮助*****
系列文章
第一篇:数据结构入门 — 链表详解_单链表
第二篇:数据结构入门 — 链表详解_双向链表
第三篇:数据结构入门 — 链表详解_循环链表
文章目录
- 前言
- 系列文章
- 什么是双向链表
- 概念与结构(图文)
- 双向链表与单链表的区别
- 带头双向循环链表接口实现(代码演示)
- 1. 动态存储结构
- 双向链表打印
- 增删查改接口
- 双向链表销毁
- 五、所有文件代码
- 1. Gitee链接
- 总结
什么是双向链表
双向链表(Doubly Linked List)是一种链表数据结构,它的每个节点都含有两个指针,一个指向前一个节点,一个指向后一个节点。相比较于单向链表,双向链表可以双向遍历,即可以从头到尾或从尾到头遍历链表。在双向链表中,每个节点包含两个指针域和一个数据域。其中,一个指针指向前驱节点,另一个指针指向后继节点。这两个指针使得双向链表的插入、删除等操作不需要像单向链表那样需要遍历整个链表来寻找前驱节点,提高了链表的操作效率。
概念与结构(图文)
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。
双向链表与单链表的区别
双向链表和单链表是两种不同的链表结构。
单向链表是一种链表,在每个节点中包含指向下一个节点的指针。这意味着在单向链表中,节点只能从头开始遍历到尾部。在单向链表中,每个节点只存储指向下一个节点的指针,而不存储指向前一个节点的指针。
双向链表是一种链表,在每个节点中包含指向下一个节点和前一个节点的指针。这意味着在双向链表中,节点可以被从头到尾或从尾到头遍历。在双向链表中,每个节点存储指向前一个节点和下一个节点的指针。
因此,双向链表可以更方便地进行双向遍历,但是需要更多的内存空间来存储每个节点的两个指针。相比之下,在单向链表中,只需要一个指针来指向下一个节点,因此内存占用量更小。
带头双向循环链表接口实现(代码演示)
带头+双向+循环链表增删查改实现
1. 动态存储结构
typedef int STDataType;
typedef struct ListNode
{struct ListNode* prev;struct ListNode* next;STDataType data;
}LTNode;
双向链表打印
void LTPrint(LTNode* phead)
{assert(phead);printf("phead<->");//跳过哨兵位LTNode* cur = phead->next;while (cur != phead){printf("%d<->", cur->data);cur = cur->next;}printf("\n");
}
增删查改接口
根据增删查改顺序编排
双向链表头插:
//头插
void LTPushFront(LTNode* phead, STDataType x)
{assert(phead);LTNode* newnode = BuyLTNode(x);LTNode* first = phead->next;newnode->next = first;first->prev = newnode;phead->next = newnode;newnode->prev = phead;}
双向链表尾插:
//尾插
void LTPushBack(LTNode* phead, STDataType x)
{assert(phead);LTNode* newnode = BuyLTNode(x);//找到最后一个LTNode* tail = phead->prev;newnode->prev = tail;tail->next = newnode;newnode->next = phead;phead->prev = newnode;
}
双向链表头删:
//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* first = phead->next;LTNode* second = first->next;free(first);phead->next = second;second->prev = phead;}
双向链表尾删:
//尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* tail = phead->prev;LTNode* tailprev = tail->prev;free(tail);phead->prev = tailprev;tailprev->next = phead;}
查找:
LTNode* LTFind(LTNode* phead, STDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
在指点位置插入:
void LTInsert(LTNode* pos, STDataType x)
{LTNode* newnode = BuyLTNode(x);LTNode* posprev = pos->prev;newnode->next = pos;pos->prev = newnode;posprev->next = newnode;newnode->prev = posprev;}
在指点位置删除:
// 把pos删除
void LTErase(LTNode* pos)
{LTNode* posprev = pos->prev;LTNode* posnext = pos->next;free(pos);posprev->next = posnext;posnext->prev = posprev;
}
双向链表销毁
void LTDestory(LTNode* phead)
{LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);phead = NULL;
}
五、所有文件代码
1. Gitee链接
***查看所有代码***
点击右边蓝色文字 DuckBro Gitee 代码仓库
总结
带头双向循环链表的基本概念和常见操作。带头双向循环链表是一种特殊的双向链表,它多了一个头节点和一个尾节点,并且首尾相连形成一个环。
这样可以实现循环遍历链表。在带头双向循环链表中,插入、删除节点等操作都有特殊处理方式。带头双向循环链表在实际应用中比较常见,如操作系统中的进程管理、音乐播放器中的播放列表等。
如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。
相关文章:
数据结构入门 — 链表详解_双向链表
前言 数据结构入门 — 双向链表详解* 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 系列文章 第一篇:数据结构入门 — 链表详解_单链表…...
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比) 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)预测效果基本介绍模型介绍程序设计参…...
SSL/TLS协议的概念、工作原理、作用以及注意事项
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…...
[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤
第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法: 问题:stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答:打开webui.bat 把 if not de…...
uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)
uniapp结合Canvasrenderjs根据经纬度绘制轨迹 文章目录 uniapp结合Canvasrenderjs根据经纬度绘制轨迹效果图templaterenderjsjs数据结构 根据官方建议要想在 app-vue 流畅使用 Canvas 动画,需要使用 renderjs 技术,把操作canvas的js逻辑放到视图层运…...
VR全景加盟会遇到哪些问题?全景平台会提供什么?
想创业,你是否也遇到这些问题呢?我是外行怎么办?没有团队怎么办?项目回本周期快吗?项目靠谱吗?加盟平台可信吗?等等这类疑问。近几年,VR产业发展迅速,尤其是VR全景项目在…...
如何进行微服务的集成测试
集成测试的概念 说到集成测试,相信每个测试工程师并不陌生,它不是一个崭新的概念,通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…...
spark grpc 在master运行报错 exitcode13 User did not initialize spark context
程序使用sparksql 以及protobuf grpc ,执行报错 ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: java.lang.IllegalStateException: User did not initialize spark context! 先说原因 : 1.使用了不具备权限…...
nginx 反向代理的原理
Nginx(发音为"engine X")是一个高性能、轻量级的开源Web服务器和反向代理服务器。它的反向代理功能允许将客户端的请求转发到后端服务器,然后将后端服务器的响应返回给客户端。下面是Nginx反向代理的工作原理: 1.客户端…...
【SpringBoot】第二篇:RocketMq使用
背景: 本文会介绍多种案例,教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中,属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动: RocketMQ 在 windows 上运行…...
飞天使-vim简单使用技巧
此文是记录技巧使用,如果想节约时间,可以直接看最后一个章节 vim 的介绍 vim号称编辑器之神,唯快不破,可扩展,各种插件满天飞。 vi 1991 vim 1.14 vim四种模式 普通模式: 移动光标, 删除文本,…...
分布式搜索引擎----elasticsearch
目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…...
AnnotationConfigApplicationContext类和ClasspathXmlApplicationContext类的区别?
在 Spring Framework 中,AnnotationConfigApplicationContext 和 ClasspathXmlApplicationContext 是两个不同的应用程序上下文实现,用于配置和管理 Spring Bean 容器。它们之间的主要区别在于配置的方式和使用场景。 1. **AnnotationConfigApplication…...
使用VSCode SSH实现公网远程连接本地服务器开发的详细教程
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
Codeforces Round 894 (Div. 3)
还是打一下卡!!! (A,B,C) 目录 A. Gift Carpet 链接 : 题面 : 题目意思 : 思路 : 代码 : B. Sequence Game 链接 : 题面 : 编辑 题目意思 : 思路 : 代码 : C. Flower City Fence 原题链接 : 题面 : 题目意思 : 思路 : 代码 : A. Gift Carpet 链…...
ACL2023 Prompt 相关文章速通 Part 1
Accepted Papers link: ACL2023 main conference accepted papers 文章目录 Accepted PapersPrompter: Zero-shot Adaptive Prefixes for Dialogue State Tracking Domain AdaptationQuery Refinement Prompts for Closed-Book Long-Form QAPrompting Language Models for Lin…...
“R语言+遥感“水环境综合评价方法
详情点击链接:"R语言遥感"水环境综合评价方法 一:R语言 1.1 R语言特点(R语言) 1.2 安装R(R语言) 1.3 安装RStudio(R语言) (1)下载地址 &…...
数据结构之哈希
哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 2. 哈希的应用2.1 位图2.2 布隆过滤器 哈希(Hash)是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式,也是一种常见的检索方…...
可视化绘图技巧100篇基础篇(七)-散点图(一)
目录 前言 适用场景 图例 普通散点图与可视化 曲线图 气泡图...
关于什么是框架
框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 性的支撑结构。在此结构上约束可以根据具体问题扩展、安插更多的组成部分,从而更迅…...
iOS开发Swift-集合类型
集合基本类型:数组 Array (有序), 集合 Set (无序不重复), 字典 Dictionary (无序键值对) 1.数组 Arrays (1)数组的表示 Array<Element> [Element](2)创建空数组 var someInts: [Int] [] someInts.count //数组长度(3)带值数组 var…...
【keepalived双机热备与 lvs(DR)】
目录 一、概述 1.简介 2.原理 3.作用 二、安装 1.配置文件 2.配置项 三、功能模块 1.core 2.vrrp 3.check 四、配置双机热备 1.master 2.backup 五、验证 1.ping验证 2.服务验证 六、双机热备的脑裂现象 七、keepalivedlvs(DR) 1.作…...
C++笔记之静态成员函数可以在类外部访问私有构造函数吗?
C笔记之静态成员函数可以在类外部访问私有构造函数吗? code review! 静态成员函数可以在类外部访问私有构造函数。在C中,访问控制是在编译时执行的,而不是在运行时执行的。这意味着静态成员函数在编译时是与类本身相关联的,而不…...
最新SQLMap进阶技术
SQLMap进阶:参数讲解 (1)–level 5:探测等级。 参数“–level 5”指需要执行的测试等级,一共有5个等级(1~5级),可不加“level”,默认是1级。可以在xml/payloads.xml中看…...
【BurpSuite常用功能介绍】
BurpSuite的使用 1.运行BurpSuite 2.代理设置 打开软件后,我们第一件事就应该去调试软件和浏览器的代理,让BURP能够正常工作抓包 proxy--options,我端口默认使用8080 然后我们打开一个浏览器,进入代理设置 (注意一点࿰…...
Leetcode 108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树 分析 给定一个有序数组,要求转换为二叉搜索树。 数组是有序的,并且要求二叉树。 这里看到数组是有序的,马上想到二分,但是又不需要完全二分 实现。 再复习二叉搜索树的结构特点: 左…...
小匠物联联合亚马逊云助力企业数智化出海
如何让家电企业出海产品数智化之路走上康庄大道?8月25日,亚马逊云科技[创新成长企业专列]这趟上云快车将开往宁波站,助力宁波的制造、软件等企业扬帆起航!现场举办“亚马逊云科技助力企业出海数智沙龙”,小匠物联受邀出席。 会议现…...
(五)k8s实战-配置管理
一、ConfigMap 使用 kubectl create configmap -h 查看示例,构建 configmap 对象 1) 基于文件夹,加载文件夹下所有配置文件,创建 kubectl create configmap <configmapName> --from-file<dirPath>2) 指定配置文件,创…...
GPT---1234
GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…...
计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm
文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…...
做网站的技术支持/文案代写收费标准
返回:贺老师课程教学链接 请写出下面程序的运行结果,再和计算机运行的结果对照。无论对错,再想一想。#include <iostream> using namespace std; class A {int a , b ; public :A( ) {ab0;cout <<"a"<<a<<…...
三星做号网站/深圳网站推广
键盘录入概述: 之前我们涉及到的数据都是写死的, 固定的数据, 这样做用户体验并不好, 我们就想着, 能不能让用户录入数据, 我们通过特定的代码来接收, 这样做就非常好玩儿了, 针对于这种情况, 我们可以通过键盘录入来实现. 即: Java中键盘录入功能指的就是Scanner…...
商城网站前端更新商品天天做吗/青岛seo网络优化公司
Qlik自助服务用户面临的一个常见挑战是编写表达式,而编写表达式的最常见原因是基于时间段的报告。可以简化这些时间段表达式-以及按时间段进行筛选或分组-自助时间段表。 这是一个包含两列的表:日期和时间段 如果日期是多个时间段的一部分…...
网上开店怎么注册/郑州seo技术博客
我们在使用 virt-install 构建虚拟机需要指定操作系统类型, 在配置之前, 我们需要了解到底有哪些可选值, 查阅了下, 可以使用 osinfo-query 来完成.这里我们使用到了两个命令, 需要安装 virt-install 和 osinfo-query安装 virt-installREHL/CentOSyum -y install virt-installD…...
政务网站的建设/seo排名工具给您好的建议下载官网
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来源丨小集https://mp.weixin.qq.com/s/o8IeIoEJUXV9i9ILm3msOASwift 官方在上个月 25 号宣布将 Swift 的 Bug 清单迁移到 Github 问题清单中。目前,第一阶…...
动画形式的h5在哪个网站做/培训学校网站
转载请注明出处。谢谢http://blog.csdn.net/harryweasley/article/details/42121485 当想到要计算差值。我们肯定想的是“2014.12.14”-“2014.12.20”4,这个方案,可是java并没有直接给我们这个方案,所以我想的是,将字符串转化为D…...