当前位置: 首页 > article >正文

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

目录

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.kler.cn/a/533353.html

相关文章:

  • 2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件
  • 电子电器架构 --- 电子电气架构设计要求与发展方向
  • LabVIEW的智能电源远程监控系统开发
  • 图漾相机——Sample_V1示例程序
  • 响应式编程_01基本概念:前世今生
  • 2. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--.NET Aspire 概览
  • 蓝桥杯整数删除(优先队列pair,模拟链表)
  • 今日AI和商界事件(2025-02-05)
  • punkt缺失问题
  • 定时任务单线程消费 redis 中数据导致消费能力不足
  • Docker深度解析:部署 SpringBoot 项目
  • TensorFlow是个啥玩意?
  • 学习threejs,pvr格式图片文件贴图
  • 108,【8】 buuctf web [网鼎杯 2020 青龙组]AreUSerialz
  • 每日Attention学习18——Grouped Attention Gate
  • 探索巨控GRM240系列远程模块的强大功能:物联应用新选择
  • deepseek、qwen等多种模型本地化部署
  • RabbitMQ 深度解析与最佳实践
  • 【LeetCode 刷题】贪心算法(1)-基础
  • React开发中箭头函数返回值陷阱的深度解析
  • 利用TensorFlow.js实现浏览器端机器学习:一个全面指南
  • 机器学习专业毕设选题推荐合集 人工智能
  • 4 HBase 的高级 shell 管理命令
  • [基础]端口隔离实验
  • Elasticsearch 就业形势
  • C++STL(二)——vector