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

链表和 list

一、单链表的模拟实现

1.实现方式

链表的实现方式分为动态实现和静态实现两种。
动态实现是通过 new 申请结点,然后通过 delete 释放结点的形式构造链表。这种实现方式最能体
现链表的特性;
静态实现是利用两个数组配合来模拟链表。一个表示数据域,另一个表示指针域,它的运行速度很快。下面演示的也都是单链表的静态实现。
2.定义 - 创建 - 初始化
两个足够大的数组,elem数组(e)用来存数据,next数组(ne)用来存下一个结点的位置;变量 h ,充当头指针,表示头结点的位置;变量 id ,为新来的结点分位置。
const int N = 1e5 + 10;
int h; // 头指针
int id; // 下一个元素分配的位置
int e[N], ne[N]; // 数据域和指针域

3.头插

//头插
void push_front(int x)
{id++;e[id]=x;mp[x]=id;ne[id]=ne[h];ne[h]=id;	
} 

4.遍历链表

//遍历链表
void print()
{for(int i=ne[h];i;i=ne[i]){cout << e[i] << " ";	}	cout << endl << endl;
} 

5.按值查找

int mp[N]; // mp[i] 表示 i 在这个元素存放的位置
//push_front的时候,mp[x] = id; // x 这个元素存放的位置是 id
//按值查找
int find(int x)
{//策略一int i;for(i=ne[h];i;i=ne[i]){if(e[i]==x)return i;	}return 0;//策略二return mp[x];
}

第一种方式就是遍历链表,如果存储的值数据范围不大,就可以用哈希表优化,就是第二种方式。当然第二种方式是有局限性的,一是存的数据过大会导致崩溃,二是不能存在相同的数据,否则这个数组中的部分数据会进行刷新。

6.在任意位置之后插入元素

//在任意位置之后插入元素
void insert(int p,int x)
{id++;e[id]=x;mp[x]=id;ne[id]=ne[p];ne[p]=id;
} 

7.删除任意位置之后的元素

//删除任意位置之后的元素
void erase(int p)
{if(ne[p]){mp[e[ne[p]]]=0;ne[p]=ne[ne[p]];}
}
在单链表的模拟实现中,我们可以发现虽然一个节点是由其数据域和指针域组成的,但真正代表该节点信息的是数据域和下标,指针域只是为了连接下一个节点的工具(其实就是下一个节点的下标,本质上是属于下一个节点的)。有了这个工具我们就能通过elem数组找到下一个节点的数据域,也能通过next数组找到下一个节点的指针域。以上就是单链表的内容了。那我们为什么不像顺序表一样,实现一个尾插、尾删、删除任意位置的元素等操作呢? 其实是能实现,但是没必要。因为时间复杂度是 O ( N ) 级别的。

二、双向链表的模拟实现

1.实现方式

依旧采用静态实现的方式。双向链表无非就是在单链表的基础上加上一个指向前驱的指针,那就再来一个数组,充当指向前驱的指针域即可。
2.定义
const int N = 1e5 + 10;
int h; // 头结点
int id; // 下一个元素分配的位置
int e[N]; // 数据域
int pre[N], ne[N]; // 前后指针域
int mp[N];

3.头插

//头插
void push_front(int x)
{	id++;e[id]=x;mp[x]=id;pre[id]=h;ne[id]=ne[h];pre[ne[h]]=id;ne[h]=id;
} 

4.遍历链表

可以直接无视 prev 数组,与单链表的遍历方式一致。
//遍历链表
void print()
{for(i=ne[h];i;i=ne[i]){cout << e[i] << " ";}cout << endl << endl;	
} 

5.按值查找

不考虑特殊情况,直接使用 mp 数组优化了。
//按值查找
int find(int x)
{return mp[x];	
} 

6.在任意位置之后插入元素

//在任意位置之后插入元素
void insert_back(int p,int x)
{id++;e[id]=x;mp[x]=id;pre[id]=p;ne[id]=ne[p];pre[ne[p]]=id;ne[p]=id;
}

7.在任意位置之前插入元素

//在任意位置之前插入元素
void insert_front(int p,int x)
{id++;e[id]=x;mp[x]=id;pre[id]=pre[p];ne[id]=p;ne[pre[p]]=id;pre[p]=id;
}

8.删除任意位置的元素

//删除任意位置的元素
void erase(int p)
{mp[e[p]]=0;ne[pre[p]]=ne[p];pre[ne[p]]=pre[p];
}

我们可以看出,双向链表只是在单链表的基础上加了pre这个前驱指针数组,本质和单链表无异,就是清楚指针域之间的关系。

三、循环链表的模拟实现

回看之前实现的带头单向链表。我们定义0表示空指针,但其实哨兵位就在0位置,所有的结构正好成环。因此循环链表就是在原有的基础上,让最后一个元素指向表头即可。在这里就用一道算法题来说明循环链表。
因为报数一直绕着圈进行,所以我们可以使用循环链表。操作的次数比较明显,因为要使所有人出圈,所有要操作总人数的次数,也就是n。在进行每一步操作时,要数m个人,但是如果数到第m个的话,我们改变其前面元素的指针域就会很困难了,所以我们可以数m-1次,再使用指针域找到第m个人的信息。
#include <iostream>
using namespace std;
const int N=110;
int ne[N]; 
int main() 
{int n,m;cin >> n >> m;for(int i=1;i<n;i++){ne[i]=i+1;}ne[n]=1;int t=n;for(int i=1;i<=n;i++){for(int j=0;j<m-1;j++){t=ne[t];}cout << ne[t] << " ";ne[t]=ne[ne[t]];}return 0;
}

四、动态链表 - list

STL 里面的 list 的底层就是动态实现的双向循环链表,增删会涉及 new 和 delete,因为new 和 delete 是非常耗时的操作,效率不高,在竞赛中一般不会使用。因为和vector都是STL的容器,使用操作也差不多,只要正常使用接口就能实现。
1. 创建 list
list<int> lt;

2.push_front / push_back

push_front :头插;push_back :尾插。
 // 尾插lt.push_back(i);// 头插lt.push_front(i);
3. pop_front / pop_back
pop_front :头删;pop_back :尾删
 // 头删lt.pop_front();// 尾删lt.pop_back();

相关文章:

链表和 list

一、单链表的模拟实现 1.实现方式 链表的实现方式分为动态实现和静态实现两种。 动态实现是通过 new 申请结点&#xff0c;然后通过 delete 释放结点的形式构造链表。这种实现方式最能体 现链表的特性&#xff1b; 静态实现是利用两个数组配合来模拟链表。一个表示数据域&am…...

windows 蓝牙驱动开发-传输总线驱动程序常见问题

以下是驱动程序开发人员在开发总线驱动程序以支持蓝牙功能时可能会遇到的一些常见问题和方案。 我的串行总线驱动程序遇到了一些错误。 它意味着什么&#xff1f; 代码 10-49&#xff1a;设备管理器生成的错误代码。 代码 51&#xff1a;当串行总线驱动程序具有相关的控制器…...

Qt修仙之路2-1 炼丹初成

widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue宠物预约上门服务预约平台

开题报告 本研究论文旨在构建并阐述一个基于 SpringBoot 和 Vue 技术栈开发的宠物上门服务预约平台的设计与实现。该平台集成了丰富的功能模块&#xff0c;为用户提供一体化的便捷服务体验。首先&#xff0c;用户能够通过注册并登录系统&#xff0c;享受个性化的服务流程。在平…...

无线AP之详解(Detailed Explanation of Wireless AP)

无线AP是什么&#xff1f; 市场上的AP基本上分为两大类&#xff1a;单纯型AP和扩展型AP。扩展型AP除了基本的AP功能之外&#xff0c;还可能带有若干以太网交换口、路由、NAT、DHCP、打印服务器等功能。 无线AP也就是一个无线交换机 无线路由器就是一个带路由功能的无线AP&am…...

Spring Boot Actuator与JMX集成实战

在微服务架构中&#xff0c;监控和管理应用的运行状态是至关重要的。Spring Boot Actuator 提供了一种便捷的方式来监控和管理 Spring Boot 应用&#xff0c;而 JMX&#xff08;Java Management Extensions&#xff09;则是一种用于管理 Java 应用的标准技术。本文将通过一个实…...

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署

春节期间&#xff0c;deepseek迅速火爆全网&#xff0c;然后回来上班&#xff0c;我就浅浅的学习一下&#xff0c;然后这里总结一下&#xff0c;我学习中&#xff0c;总结的一些知识点吧&#xff0c;分享给大家。具体的深度安装部署&#xff0c;这里不做赘述&#xff0c;因为网…...

camera光心检测算法

1.概要 光心检测算法&#xff0c;基于opencv c实现&#xff0c;便于模组厂快速集成到软件工具中&#xff0c;适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度&#xff0c;便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…...

【MySQL】向后兼容设计规范(无回滚场景)

MySQL 向后兼容设计规范&#xff08;无回滚场景&#xff09; 在 不支持数据库回滚 且需保证 长期向后兼容性 的系统中&#xff0c;需通过 架构设计 和 流程管控 规避风险。以下是关键设计规范&#xff1a; 一、变更流程规范 变更分类分级 变更类型风险评估等级审批流程测试要求…...

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

1.stm32启动 1.1 msp和pc的初始值&#xff0c;第一步&#xff1a; 2.boot的值就被锁定了 可以根据实际绑定的值变动&#xff0c; 这里补充一点boot1和0的原理&#xff1a; 1.2来点刺激的&#xff1a; 这里我插入一个链接&#xff1a; 【明解STM32】一文搞明白STM32芯片存储…...

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…...

DeepSeek辅助段落扩写的能力怎么样?

DeepSeek-R1在学术写作的诸多细节层面展现出了显著的应用价值。接下来我们将通过一系列具体案例&#xff0c;深入探讨该工具如何在扩写、翻译、发表以及内容改进等关键环节为学术写作提供有力支持。在提问环节&#xff0c;DeepSeek-R1能够高效地简化提示词&#xff0c;并精准地…...

分形的魅力:数学与艺术的完美结合

分形的魅力&#xff1a;数学与艺术的完美结合 分形&#xff08;Fractal&#xff09;是一种神奇的数学结构&#xff0c;它以其无限的复杂性和自相似性吸引了无数科学家、艺术家和数学爱好者。分形不仅仅是数学中的一个概念&#xff0c;它还广泛应用于自然科学、计算机图形学和艺…...

如何通过工业智能网关进行数控机床数据采集?

数控机床数据采集过程是一个从物理连接到数据处理的完整链条&#xff0c;涉及设备连接、数据采集、预处理和传输的复杂过程&#xff0c;包含通信协议匹配、设备配置、数据采集设置、数据预处理和传输等多个环节。天拓四方自主研发的TDE工业智能网关作为这一过程中的核心设备&am…...

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果&#xff0c;通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感&#xff0c;比如水的波动、反射、折射、透明等&#xff0c;可以让人感觉像真实的水一样流动闪耀。 核心特点就是&#xff1a; 动态波纹光学特…...

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

随着自动驾驶技术的快速发展&#xff0c;车辆准确感知周围环境的能力变得至关重要。BEV&#xff08;Birds-Eye-View&#xff0c;鸟瞰图&#xff09;感知技术&#xff0c;以其独特的视角和强大的数据处理能力&#xff0c;正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...

【重新认识C语言----结构体篇】

目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体&#xff1f; 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…...

#渗透测试#批量漏洞挖掘#Splunk Enterprise for Windows 任意文件读取漏洞( CVE-2024-36991)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

苹果公司宣布正式开源 Xcode 引擎 Swift Build145

2025 年 2 月 1 日&#xff0c;苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言&#xff0c;用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生&#xff1a;2014 年&#xff0c;苹果在全球…...

7.list

本篇博客梳理C的STL中的list容器 一、list的基本结构与使用 1&#xff0e;list的介绍 list的底层是带头循环双向链表 带头&#xff1a;含哨兵位 循环&#xff1a;尾节点的next指针指向哨兵位 双向&#xff1a;每个节点具有两个指针域&#xff0c;一个指针指向前一个结点 2…...

电脑频繁黑屏怎么办

有没有遇到过这种糟心事儿&#xff1a;正兴致勃勃地打游戏、赶方案&#xff0c;或者追着喜欢的剧&#xff0c;电脑突然黑屏了&#xff01;而且还频繁出现&#xff0c;简直让人抓狂。今天咱们就来好好聊聊&#xff0c;电脑频繁黑屏到底该怎么办。 硬件问题排查 检查显示器连接…...

仓库自动化搬运:自动叉车与AGV选型要点及核心技术解析

自动叉车与AGV均可实现自主作业&#xff0c;无需人工驾驶即可搬运托盘化货物。然而&#xff0c;这两种解决方案存在一些关键差异。 自动叉车与AGV的对比 自动叉车与AGV是截然不同的车辆&#xff0c;其差异主要源于原始设计&#xff1a; 自动叉车是制造商对传统手动叉车进行改…...

鸿蒙仓颉语言开发实战教程:商城登录页

听说Pura80要来了&#xff1f;感觉华为的新品像下饺子一样&#xff0c;让人目不暇接&#xff0c;每隔几天就有发布会看&#xff0c;真不错呀。 节后第一天&#xff0c;为了缓解大家假期的疲惫&#xff0c;咱们今天做点简单的内容&#xff0c;就是商城的登录页面。 其实这一次分…...

大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森林 Bagging Boosting

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大模型篇章已经开始&#xff01; 目前已经更新到了第 22 篇&#xff1a;大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…...

Linux共享内存原理及系统调用分析

shmget 是 System V 共享内存的核心系统调用之一&#xff0c;其权限位&#xff08;shmflg 参数&#xff09;决定了共享内存段的访问控制和创建行为。以下是权限位的详细解析&#xff1a; 权限位的组成 shmflg 参数由两部分组成&#xff1a; 权限标志&#xff08;低 9 位&…...

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…...

【Web应用】若依框架:基础篇21二次开发-页面调整

文章目录 ⭐前言⭐一、课程讲解⭐二、怎样选择设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐三、怎样使用设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内…...

历史记录隐藏的安全风险

引言 在数字化生活与工作场景中&#xff0c;历史记录功能广泛存在于浏览器、办公软件、移动应用等各类平台。它通过记录用户的搜索内容、操作痕迹、访问路径等信息&#xff0c;为用户提供便捷的操作体验和个性化服务。然而&#xff0c;这种看似便利的功能背后&#xff0c;却隐藏…...

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

2025年6月1日&#xff0c;去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一&#xff0c;旨在通过贡献驱动的积分体系&#xff0c;激励更广泛的社区参与&#xff0c;为用户带来现实世界资产&#xff08;RWA&am…...

Monorepo架构: 项目管理工具介绍、需求分析与技术选型

概述 如何实现 monorepo&#xff0c;以及在项目中如何管理多个包&#xff0c;在进行具体项目开发前&#xff0c;有必要强调一个重要思维 — 全局观 即看待技术方案时&#xff0c;要从需求角度出发&#xff0c;综合考量该方案能否长远满足项目或团队需求 为什么要有全局观呢&a…...