数据结构 单链表的模拟实现

一、链表的定义


线性表的链式存储就是链表。
它是将元素存储在物理上任意的存储单元中,由于⽆法像顺序表⼀样通过下标保证数据元素之间的逻辑关系,链式存储除了要保存数据元素外,还需额外维护数据元素之间的逻辑关系,这两部分信息合称结点(node)。即结点有两个域:保存数据元素的数据域和存储逻辑关系的指针域。

二、定义-创建-初始化


1. 两个⾜够⼤的数组,⼀个⽤来存数据,⼀个⽤来存下⼀个结点的位置
2. 变量h ,充当头指针,表⽰头结点的位置
3. 变量id ,为新来的结点分位置

const int N = 1e5 + 10;
int h; // 头指针 
int id; // 下⼀个元素分配的位置 
int e[N], ne[N]; // 数据域和指针域 
// 下标 0 位置作为哨兵位 
// 其中 ne 数组全部初始化为 0,其中 ne[i] = 0 就表⽰空指针,后续没有结点

三、头插

// 头插 
void push_front(int x)
{
 // 先把 x 放在⼀个格⼦⾥⾯ 
 id++;
 e[id] = x;
 // 修改指针,顺序不能颠倒! 
 // 1. x 的右指针指向哨兵位的后继 
 // 2. 哨兵位的右指针指向 x 
 ne[id] = ne[h];
 ne[h] = id;
}

四、遍历链表

// 打印链表 
void print()
{
 // 定义⼀个指针从头结点开始 
 // 通过 ne 数组逐渐向后移动 
 // 直到遇到空指针 
 for(int i = ne[h]; i; i = ne[i])
 {
 cout << e[i] << " ";
 }
 cout << endl << endl;
}

通过i是否等于0来判断。

五、按值查找

解法⼀:遍历整个链表即可。
解法⼆:如果存储的值数据范围不⼤,可以⽤哈希表优化。(不知道哈希表是什么没有关系,只要知道mp数组的作⽤,把它当成⼀个标记数组即可。)

int mp[N]; // mp[i] 表⽰ i 在这个元素存放的位置 
/*
 push_front 和 insert 的时候,打上标记 
 mp[x] = id; // x 这个元素存放的位置是 id 
 
 erase 的时候,消除标记 
 mp[x] = 0;
*/
// 查询值为 x 的元素存储的位置 
int find(int x) // 注意,这⾥传⼊的是元素的值 
{
 // 策略⼀:先找到 x,然后返回 x 后⾯的元素 
 for(int i = ne[h]; i; i = ne[i]) // 遍历链表 
 {
 if(e[i] == x) // 如果找到 x 
 {
 return i;
 }
 }
 // 找不到就返回 0 
 return 0;
 // // 策略⼆:使⽤哈希表优化 
 return mp[x]; // mp[x] ⾥⾯就存着 x 这个元素存储的位置下标 
}

如果运用map操作,那么在头插中应该这样写

    id++;
    e[id] = x;
    mp[x] = id; 
    ne[id] = ne[h];
    ne[h] = id;

六、在任意位置之后插⼊元素

// 在存储位置为 p 的元素后⾯,插⼊⼀个元素 x 
void insert(int p, int x) // ⼀定要注意,这⾥的 p 是位置,不是元素 
{
 id++; // x 这个元素分配的位置 
 e[id] = x; // 将 x 放在 id 位置处 
 ne[id] = ne[p]; // x 指向 p 的后⾯ 
 ne[p] = id; // p 指向 x 
}

和头插操作差不多。

就是把ne[h]换成了ne[p]。

若使用mp数组,应该

    id++;
    e[id] = x;
    mp[x] = id;

    ne[id] = ne[p];
    ne[p] = id;

七、删除任意位置之后的元素

// 删除存储位置为 p 后⾯的元素 
void erase(int p) // 注意 p 表⽰元素的位置 
{
 if(ne[p]) 
 {
 mp[e[ne[p]]] = 0; // 将 p 后⾯的元素从 mp 中删除 
 ne[p] = ne[ne[p]]; // 指向下⼀个元素的下⼀个元素 
 }
}

所有测试代码:

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// 创建 
int e[N], ne[N], h, id;
int mp[N]; // mp[i] 表⽰ i 这个数存储的位置 
// 遍历链表 
void print()
{
 for(int i = ne[h]; i; i = ne[i])
 {
 cout << e[i] << " ";
 }
 cout << endl << endl;
}
// 头插 
void push_front(int x)
{
 id++;
 e[id] = x;
 mp[x] = id; // 标记 x 存储的位置 
 // 先让新结点指向头结点的下⼀个位置 
 // 然后让头结点指向新来的结点 
 ne[id] = ne[h];
 ne[h] = id;
}
// 按值查找 
int find(int x)
{
 // // 解法⼀:遍历链表 
 // for(int i = ne[h]; i; i = ne[i])
 // {
 // if(e[i] == x) return i;
 // }
 // return 0;
 // 解法⼆:⽤ mp 数组优化 
 return mp[x];
}
// 在任意位置 p 之后,插⼊⼀个新的元素 x 
void insert(int p, int x)
{
 id++;
 e[id] = x;
 mp[x] = id;
 ne[id] = ne[p];
 ne[p] = id;
}
// 删除任意位置 p 后⾯的元素 
void erase(int p)
{
 if(ne[p]) // 当 p 不是最后⼀个元素的时候 
 {
 mp[e[ne[p]]] = 0; // 把标记清空 
 ne[p] = ne[ne[p]];
 }
}
int main()
{
 for(int i = 1; i <= 5; i++)
 {
 push_front(i);
 print();
 }
 //cout << find(1) << endl;
 //cout << find(5) << endl;
 //cout << find(6) << endl;
 // insert(1, 10);
 // print();
 // insert(2, 100);
 // print();
 erase(2);
 print();
 erase(4);
 print();
 return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967798.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Avalonia-wpf介绍

文章目录 工程简述窗体样式暗色模式亚克力模糊效果ExperimentalAcrylicBorder” 和 “ExperimentalAcrylicMaterial” 的介绍ExperimentalAcrylicBorderExperimentalAcrylicMaterial按钮排版按钮图标按钮命令响应式命令添加一个新对话框对话框窗口样式对话框的输入与输出显示对…

Node.js开发属于自己的npm包(发布到npm官网)

在 Node.js 中开发并发布自己的 npm 包是一个非常好的练习&#xff0c;可以帮助我们更好地理解模块化编程和包管理工具&#xff0c;本篇文章主要阐述如何使用nodejs开发一个属于自己的npm包&#xff0c;并且将其发布在npm官网。在开始之前确保已经安装了 Node.js 和 npm。可以在…

操作系统常见调度算法的详细介绍

目录 1. 先进先出算法&#xff08;FIFO&#xff09; 2. 前后台调度算法 3. 最短处理机运行期优先调度算法&#xff08;短进程优先算法&#xff09; 4. 最高响应比优先调度算法&#xff08;HRRN&#xff09; 5. 优先级调度算法 6. 时间片轮转调度算法 7. 多级反馈队列轮转…

ADB详细教程

目录 一、ADB简介 二、配置 配置环境变量 验证是否安装成功 三、简单使用 基本命令 设备连接管理 USB连接 WIFI连接&#xff08;需要USB线&#xff09; 开启手机USB调试模式 开启USB调试 四、其他 更换ADB默认启动端口 一、ADB简介 ADB&#xff08;Android Debug…

WEB攻防-第60天:PHP反序列化POP链构造魔术方法流程漏洞触发条件属性修改

目录 一、序列化与反序列化基础 1.1 什么是序列化与反序列化 二、魔术方法的生命周期 2.1 常见的魔术方法 2.2 模式方法的生命周期触发调用 2.2.1 __construct() 2.2.2 __destruct() 2.2.3 __sleep() 2.2.4 __wakeup() 2.2.5 __invoke() 2.2.6 __toS…

SQLMesh系列教程-2:SQLMesh入门项目实战(下篇)

上篇我介绍了环境搭建、duckdb数据准备、sqlmesh数据模型、plan命令运行。本文继续介绍审计、测试、生成血缘关系以及python模型等。 有两种方法可以在SQLMesh中创建宏。一种方法是使用Python&#xff0c;另一种方法是使用Jinja。这里我们创建Python宏。让我们构建简单的Python…

自主项目面试点总结

1、许苑–OJ判题系统 技术栈&#xff1a;Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、项目介绍: 一个基于微服务的OJ系统&#xff0c;具备能够根据管理员预设的题目用例对用户提交的代…

Macbook Pro快速搭建Easysearch学习环境

在学习过程中&#xff0c;我们有时身边没有可用的服务器&#xff0c;这时就需要借助自己的 Mac 来安装和学习 Easysearch。然而&#xff0c;Easysearch 官网并未提供 Mac 版本的安装教程&#xff0c;下面我将详细整理我在 Mac 上安装和使用 Easysearch 的折腾经历。 Easysearc…

Arduino 第十三章:红外接收

Arduino 第十三章&#xff1a;红外接收 一、红外接收概述 红外接收在日常生活和电子制作中十分常见&#xff0c;像电视、空调等家电的遥控器就是利用红外信号来实现远程控制的。在 Arduino 项目里&#xff0c;借助红外接收模块能够让设备接收红外信号&#xff0c;进而实现诸如…

朝天椒USB服务器:解决加密狗远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中&#xff0c;加密狗作为防止软件盗版的重要手段&#xff0c;广泛应用于各类软件授权场景。然而&#xff0c;随着企业超融合进程不断加…

第二篇:电压与电流的“锡安之战”——电路定律在800V高压平台中的应用

——基尔霍夫与戴维南如何破解新能源汽车的“高压密码” 核心隐喻&#xff1a;电路定律的“数字起义” 在《黑客帝国》中&#xff0c;锡安的反抗军通过破解母体协议实现逆袭。而在新能源汽车的800V高压平台中&#xff0c; 基尔霍夫定律 和 戴维南定理 正是工程师手中的“通…

【牛客】动态规划专题一:斐波那契数列

文章目录 DP1 斐波那契数列法1&#xff1a;递归法2&#xff1a;动态规划法3&#xff1a;优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict&#xff0c;在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1&#xff1a;递归 // 递归 #include <iostream>…

innovus如何分步长func和dft时钟

在Innovus工具中&#xff0c;分步处理功能时钟&#xff08;func clock&#xff09;和DFT时钟&#xff08;如扫描测试时钟&#xff09;需要结合设计模式&#xff08;Function Mode和DFT Mode&#xff09;进行约束定义、时钟树综合&#xff08;CTS&#xff09;和时序分析。跟随分…

5-R循环

R 循环 ​ 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多…

DeepSeek AI R1推理大模型API集成文档

DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展&#xff0c;大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型&#xff0c;凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计&#xff0c;吸引了大量开发…

知识图谱_protege的安装

目录 1.下载protege 2.安装可视化工具Graphviz 3.配置 参考【知识图谱】3.Protege下载安装-CSDN博客 1.下载protege 我在官网下载不了所以我就没有在官网下载 项目首页 - Protege-5.5.0Windows版本快速下载指南:Protege是一个广受欢迎的、强大的知识建模工具&#xff0c;用…

从BERT到ChatGPT:大模型训练中的存储系统挑战与技术发展——论文泛读

计算机研究与发展 2024 Paper 论文阅读笔记整理 问题 以ChatGPT为代表的大模型在文字生成、语义理解等任务上表现卓越&#xff0c;但大模型的参数量在3年内增长数万倍&#xff0c;且仍呈现增长的趋势。大模型训练面临存储挑战&#xff0c;存储需求大&#xff0c;且具有独特的…

船舶维保管理系统

一、项目介绍 381.基于SpringBoot的船舶维保管理系统&#xff0c;系统包含四种角色&#xff1a;管理员、船家、维保人员、维保公司,系统分为前台和后台两大模块&#xff0c;主要功能如下。 船家&#xff1a; - 个人中心&#xff1a;管理个人信息。 - 公告管理&#xff1a;查看…

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…