算法:链表

2023-11-11

单链表

单链表是一种链式存取的数据结构

链表中的数据是以结点来表示的,每个结点存储两个数据,一是该结点本身的值,二是其指向的下一结点的下标

用e[i]表示节点i的值,用ne[i]表示结点i指向的下一结点的坐标

head表示头结点的下标,idx表示当前已经用到了哪个下标,空结点下标为-1

起初head-->空(即head=-1),idx=0,0为用到的第一个下标,依次递增为1,2,3,4......,因而下标是不会重复的

插入操作:如:a-->b,在结点a,b中插入一个结点,idx为当前的结点下标,首先将要插入的值存储到该idx结点中,然后,将该结点指向b,再将a指向idx

删除操作:如:a-->b-->c,要删除b,则只需将a指向c即可

初始化 

void init(){
head=-1;
idx=0;
}

将x插到头结点

void add_to_head(int x){
e[idx]=x;
ne[idx]=head;
head=idx;
idx++;
}

将x插到下标是k的点后面 

void add(int k,int x){
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}

 将下标是k的点后面的点删掉(注意,这样是删除不了头结点的,删除头结点为head=ne[head])

void remove(int k){
ne[k]=ne[ne[k]];
}

例:

该题是在第k个插入的数后面操作,因为第一个插入的数下标为0,第二个插入的数下标为1,以此类推,因而第k个插入的数下标为k-1

#include<iostream>
using namespace std;
const int N=100010;
int head,idx,e[N],ne[N];
void init(){
head=-1;
idx=0;
}
void add_to_head(int x){
e[idx]=x;
ne[idx]=head;
head=idx;
idx++;
}
void add(int k,int x){
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
void remove(int k){
ne[k]=ne[ne[k]];
}
int main()
{
int k,x;
char op;
int m;
cin>>m;
init();
while(m--){
cin>>op;
if(op=='H'){
cin>>x;
add_to_head(x);
}
else if(op=='D'){
cin>>k;
if(!k) head=ne[head];
remove(k-1);
}
else{
cin>>k>>x;
add(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<' ';
cout<<endl;
return 0;
}

双链表 

双链表和单链表思想基本一致,理解了单链表之后,就很容易理解双链表了

单链表是单向的,只可以指向一边,而双链表既可以指向左边,又可以指向右边

l[i]表示i结点向左指向的下标,r[i]表示i结点向右指向的下标

可以用下标0代表头结点,用下标1代表尾结点,故idx从2开始,这样做的好处是不用像单链表那样在头结点插入一个数和在下标为k的数后面插入一个数的函数要分开写,只要写一个函数就行了

插入操作:要想在k,b之间插入一个结点,首先记录该值,然后先将该结点指向b(即r[k])和k,再将b(即r[k])指向该结点,k指向该结点,最后不要忘记更新idx值

删除操作:要想删除结点k,只需将a指向b,b指向a(a即为l[k],b即为r[k])

初始化 

void init(){
r[0]=1,l[1]=0;
idx=2;
}

 在下标是k的点的右边插入一个点(要想在下标是k的左边插入一个点,只需调用函数add(l[k],x);)

void add(int k,int x){
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[k]]=idx;
r[k]=idx;
idx++;
}

删除第k个点 

void remove(int k){
r[l[k]]=r[k];
l[r[k]]=l[k];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法:链表 的相关文章

随机推荐

  • retrofit合理的处理response

    OKHttp retrofit 有时候使用起来确实会受到一些局限 比如 处理response的加解密 处理response的返回的字段与本地封装的不一样 又不能改本地的字段 所以需要对返回的JSON进一步处理 别名的方式 处理respons
  • 【mysql】云服务器被攻击,数据库以及数据都被删除如何通过binlog日志恢复

    前言 小编买了一台阿里云服务器 然后通过docker 部署了mysql 然后用了一段时间突然发现数据都没有了 然后就排查问题 发现是被攻击了 如下图 you must pay 0 26BTC 怒了 好多钱呢 如果有同样的问题 可以参考此博客
  • MFC实现socket网络通信--主机与服务器之间传送数据

    MFC实现socket网络通信 模拟主机与服务器之间传送数据 MFC实现socket网络通信 1 新建MFC应用程序 2 创建服务端窗口界面 3 写服务器代码 4 创建客户端窗口界面 5 客户端代码部分 6 开始调试 7 小结 MFC实现s
  • smallworld bm 配为ldap授权后授权界面中无法显示设计权限,需要修改config_local_and_ldap.xml配置文件

    config local and ldap xml配置文件增加相应配置
  • Sequel Pro导出关系图,可视化你的数据库

    教程链接 https nicolaswidart com blog exporting relations diagram from sequel pro 简易步骤 使用homebrew安装 brew install graphviz Se
  • 【网络通信】Netty面试专题之十大考问

    1 BIO NIO 和 AIO 的区别 BIO 一个连接一个线程 客户端有连接请求时服务器端就需要启动一个线程进行处理 线程开销大 伪异步 IO 将请求连接放入线程池 一对多 但线程还是很宝贵的资源 NIO 一个请求一个线程 但客户端发送的
  • 你知道this.$options吗?(Vue)

    题记 我们在Vue项目中会有很多情况下需要用到this options 所以接下来我们介绍几个场景会用到 options 我们想第一个问题当我们在template经常使用filter 那么你可以直接在methods里边用过滤器吗 我们在表单
  • GC 的三种基本实现方式

    GC 的三种基本实现方式 参考资料 代码的未来 作者 日 松本行弘 由于并非本人原著 我只是个 搬运工 SO 未经本人允许请尽情转载 另外个人像说明一下这里所说的GC指泛指垃圾回收机制 而单指Java或其他某种特定语言中的GC 可能具体语言
  • 【PTA】7-6 整除光棍

    7 6 整除光棍 这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一
  • 设计模式-day02

    4 创建型模式 4 2 工厂模式 4 2 1 概述 需求 设计一个咖啡店点餐系统 设计一个咖啡类 Coffee 并定义其两个子类 美式咖啡 AmericanCoffee 和拿铁咖啡 LatteCoffee 再设计一个咖啡店类 CoffeeS
  • Ubuntu虚拟机和Windows实现文件拖拽复制粘贴

    方法 安装vm tools 1 在Ubuntu内部鼠标右键打开终端 2 更新apt get 一般新装的系统都需要更新apt get sudo apt get update ps 若无法更新 可以试着换一下镜像站 Ubuntu系统配置镜像站
  • Python基础系列2——Numpy数值计算及分析

    文章目录 1 实验内容 2 实验过程 2 1 numpy数组的建立 索引 计算 统计等 2 2 利用numpy对数据集 iris data 进行分析 3 实验结论及注意事项 1 实验内容 1 numpy数组的建立 索引 计算 统计等 2 利
  • BIOS和BootLoader uboot

    BIOS BIOS是英文 Basic Input Output System 的缩略语 直译过来后中文名称就是 基本输入输出系统 其实 它是一组固化到计算机内主板上一个ROM芯片上的程序 它保存着计算机最重要的基本输入输出的程序 系统设置信
  • Java Sort方法

    Java的sort方法就是排序 而且排的是升序 你要想降序可以先获得升序的 然后倒过来或者你重新写比较器Comparator的接口就可以 一 sort 排序方法本身 这里讲的sort方法 都是以Arrays类里面的方法为准 因为很多类的so
  • STM32 端口复用学习

    一 STM32端口复用 1 端口复用定义 STM32有很多的内置外设 这些外设的外部引脚都是与GPIO复用 也就是说 一个GPIO如果可以复用为内置外设的功能引脚 那么当这个GPIO作为内置外设使用的时候 就叫做复用 2 作用 最大限度的利
  • vue 实现计时器组件

    vue 实现计时器组件 结果图 v if 和 v show 的区别 总结来说v if是在不断的销毁和重建 v show 只是改变 display 属性 元素依然存在 dom 中 v if 切换开销大 v show 初始化开销大 time v
  • 人称代词用法大全

    语言发明出来自然是要给人用的 所以跟人相关的词就特别多 划分的很细 我们提到某个具体的人一般就直接说名字 但有时是泛指 或者前面已经提过名字了 后面用个啥简称指代下就清楚了 这就需要代词 代词嘛顾名思义是一个代称 是指代某个人或者某类人 某
  • 搭建使用 VS 开发 Qt 项目的环境

    搭建使用 VS 开发 Qt 项目的环境 个人认为 使用 Qt 工具开发 Qt 项目是最好的方案 在开发的过程出现的 bug 会比较少一些 但是有些同伴可能对 VS 比较钟爱 而 VS 又有此功能 因此想采用 VS 进行开发 本文将本人搭建成
  • nacos源码启动找不到istio包

    现象 源码版本2 1 0 启动时 编译不通过 报错 找不到 istio mcp v1alpha1 MetadataOuterClass Metadata istio networking v1alpha3 ServiceEntryOuter
  • 算法:链表

    单链表 单链表是一种链式存取的数据结构 链表中的数据是以结点来表示的 每个结点存储两个数据 一是该结点本身的值 二是其指向的下一结点的下标 用e i 表示节点i的值 用ne i 表示结点i指向的下一结点的坐标 head表示头结点的下标 id