C32.【C++ Cont】静态实现双向链表及STL库的list

devtools/2025/2/6 21:43:28/

目录

1.知识回顾

2.静态实现演示图

3.静态实现代码

1.初始双向链表

2.头插

3.遍历链表

4.查找某个值

4.任意位置之后插入元素

 5.任意位置之前插入元素

 6.删除任意位置的元素

4.STL库的list


1.知识回顾

96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删
97.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数

上述文章均为动态实现双向链表,由于竞赛中追求运行速度快,因此不会动态实现双向链表,本文介绍静态实现双向链表

2.静态实现演示图

由于每一个结点要存储三个信息,因此静态实现使用三个数组:数值数组val,前驱数组prev,后继数组next,三个数组中同一个下标位置的元素打包成一个节点,如下图所框的(head指向头节点)

注:这里实现的双向链表为不循环的

将上方图改成逻辑结构再画图

3.静态实现代码

1.初始双向链表

	const int N=1e5+10;//一开始prev数组和next数组元素值都为-1(无效下标),为空链表int prev[N]=-1; int val[N];int next[N]=-1;//初始情况head和id都指向哨兵位结点 int head=0;int id=0;

2.头插

先保存新数据的值,再修改next和prev数组

只要①指针最后修改即可

	void push_front(int data){val[++id]=data;next[id]=next[head];prev[next[head]]=id;prev[id]=head;next[head]=id;//确保next[head]最后被修改 }

3.遍历链表

只需要看next数组即可遍历

	void print(){for (int i=next[head];i!=-1;i=next[i]){cout<<val[i]<<" ";}	} 

4.查找某个值

和打印逻辑一样,按链表的方式遍历,注意不能只查val数组,有些元素被"删除"了(即按链表的方式查不到),但仍然存在于val数组中

只需要看next数组,查找到data在链表中第一次出现的位置 ,此方法时间复杂度为O(N)

	void find(int data){for (int i=next[head];i!=-1;i=next[i]){if (val[i]==data){cout<<data<<"的下标为"<<i;return; }}cout<<"未找到";}

如果使用标记数组mp优化(哈希表),直接return mp[x],时间复杂度O(1),但此方法有局限

4.任意位置之后插入元素

设在任意位置pos之后插入元素data,本质上和头插操作一样.,只要最后修改pos的后继指针即可

	void insert_after(int pos,int data){val[++id]=data;next[id]=next[pos];prev[next[pos]]=id;prev[id]=pos;next[pos]=id;//确保next[pos]最后被修改 }

 5.任意位置之前插入元素

设在任意位置pos之前插入元素data,本质上和头插操作一样.,只要最后修改pos的前驱指针即可

	void insert_before(int pos,int data){val[++id]=data;next[prev[pos]]=id;prev[id]=prev[pos];next[id]]=pos;prev[pos]=id;//确保prev[pos]最后被修改 }

 6.删除任意位置的元素

修改两个指针即可

	void erase(int pos){prev[next[pos]]=prev[pos];next[prev[pos]]=next[pos];}

4.STL库的list

提醒:list 的底层就是动态实现的双向循环链表,增删会涉及new和delete,执行速度慢,竞赛中不建议使用

初始化list: list<任意数据类型> 名称

list<int> l;

头插: l.push_front 尾插: l.push_back 头删: l.pop_front 尾删: l.pop_back


http://www.ppmy.cn/devtools/156630.html

相关文章

人工智能学习(四)之机器学习基本概念

机器学习基本概念详细解析&#xff1a;从生活实例轻松入门 在当今数字化时代&#xff0c;机器学习作为人工智能领域的核心技术之一&#xff0c;正深刻地改变着我们的生活和工作方式。从智能语音助手到图像识别系统&#xff0c;从个性化推荐引擎到自动驾驶汽车&#xff0c;机器…

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…

Redis缓存穿透、击穿、雪崩介绍以及解决方案

一、缓存穿透 1.1 什么是缓存穿透&#xff1f; 指的是&#xff0c;外部进来的请求&#xff0c;查询一个不存在的数据。Redis中没有&#xff0c;数据库中也没有&#xff0c;这时候如果外部恶意大量请求&#xff0c;所有请求会直接查询数据库&#xff0c;导致数据库崩溃 1.2 解决…

C++多线程编程——call_once和单例模式

目录 1. 前言 2. call_once和once_flag 3. 后记 3.1 单例类的析构问题 3.2 饿汉式单例模式的线程安全问题 1. 前言 之前在讲解单例模式时&#xff0c;有提到懒汉式单例模式使用了双重检测Double-Checked Locking Pattern (DCLP)来解决多线程的安全访问问题。但是该方法也…

数据结构(AVL树、B-Tree、B+Tree)

AVL树 AVL树是一种自平衡的二叉搜索树&#xff0c;它的特点是每个节点的左子树和右子树的高度差&#xff08;平衡因子&#xff09;的绝对值不超过1。这种平衡性保证了AVL树在进行查找、插入和删除操作时都能保持较高的效率。 平衡因子 在AVL树中&#xff0c;每个节点都维护一…

MySQL--》日志与主从复制的实战技巧

目录 日志 错误日志 二进制日志 查询日志 慢查询日志 主从复制 日志 日志&#xff1a;是记录数据库操作和事务的文件&#xff0c;主要用于帮助数据库管理员(DBA)跟踪、恢复数据以及进行故障排查&#xff0c;日志是MySQL数据库管理中非常重要的一部分&#xff0c;常见的日…

C基础寒假练习(2)

一、输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 &#xff11;.原理及网络结构 &#xff11;.&#xff11;&#xff32;&#xff2e;&#xff2e; 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…