算法--数据结构

这里写目录标题

本节内容

链表与邻接表

链表

主要思想

因为用真正的链表来写算法的话 会new很多东西 而new的过程是非常慢的

所以我们要用数组来写链表

如上图 链表分为单链表和双链表 单链表主要是邻接表 主要作用是存储图和树

e\[\]数组用来存储各个结点的val值 而ne\[\]数组用来存储各个结点的next指针 而表示在数组里就是存储下一个结点的数组下标

最后的空地址用-1表示

head表示指向头结点的指针 实际上就是头结点的下标

!!所有的结点都在e\[\]数组里 但是他们的排序不是按照e\[\]的下标按照顺序连续排序的 他们的排序是一个链表 存在ne\[\]数组里

ek 是指下标为k的e\[\]数组中的值 也就是在e\[\]数组中 下标为k的值

nek 是指在e\[\]数组中下标为k的结点 下一个结点在e\[\]数组中的位置(下标)

同时会定义一个int变量idx 存储当前操作的点的下标 实质上发挥着指针的作用

他会指针一个e\[\]数组中 最新的可用的位置 用来新建一个结点

链表操作

初始化+在head结点后面插入

初始化就是将head改为-1 意思是head指向-1位置的空间 也就是空指针

然后idx可以更新为0 因为e\[\]数组中第一个可用位置就是下标为0的位置

插入

首先新建结点 eidx=x

之后next域指向头结点 neidx=head

因为head存储的就是第一个数据的下标

之后将head指向新插入的结点 head=idx

最后idx后移 更新最新的可操作的位置的下标

普通插入

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

删除操作

注意中括号里就是存储的下标

!!所有的结点都在e\[\]数组里 但是他们的排序不是按照e\[\]的下标按照顺序连续排序的 他们的排序是一个链表 存在ne\[\]数组里

注意 k结点的下一个结点的下标不一定是k+1 而是nek 这就是k结点的下一个结点在e\[\]数组中的下标

而e\[\]数组中的元素的位置排序 是按照生成的时间来排序的 因为生成一个结点就是在e\[\]数组中新建一个数据

比如 第k个插入的点 他的下标是k-1 这里说的就是在e\[\]数组中的下标

例子



注意光标所在行给了特判

双链表(双向循环链表)

主要思想

在单链表的基础上 加了两个指针域函数 一个是l 一个是r

因为是双向循环链表 可以让0号位置的空间是 头结点

1号位置是尾结点

这样的话 head的值就是0 tail(指向尾结点的指针)的值就是1

操作

初始化+双向插入

初始化 因为是循环链表 头结点和尾结点也是双向链接 所以 r0=1 l1=0;

同时 因为0 1 的位置被占用了 所以idx初始化是2

插入:

在下标为k的节点后面插入

先新建结点 eidx=x

首先更新新节点的r 和 l

然后 更新两端结点的指针数组

先更新 右端点的 l 数组 再更新左端点的 r 数组

不然如果先更新r 那么就找不到右端点的下标了 也就是找不到右端点了

在下标为k的点的左边插入

在k左边插入 实际上就是k的前一个结点的右边插入 所以改一下函数输入就行 add(lk,x)

删除第k个点

将左边点的r 更新为 右边点的下标

将右边点的l 更新为 左边点的下标

邻接表

主要思想

就是将所有节点的邻节点用链表存了起来

栈和队列

主要思想

先进后出

主要操作

tt是栈顶指针 也就是栈顶下标 初始值为0(主要目的是好判断是不是空 因为初始化为0之后 一旦有元素插入 那么tt>0)

队列

主要思想

先进先出

操作

hh表示队头下标 tt表示队尾下标

tt初始化为-1)(这里不用再向栈一样用tt>0来判断是不是为空了 直接用hh<=tt 来判断是不是有元素 所以tt就可以初始化为-1 这样插入元素的时候 直接从下标0开始)

hh初始化为0

(不进行初始化 默认是0)

单调栈与单调队列

单调栈

主要思想

单调栈的题型:

在i的位置插入一个数x

找到在该序列中 左边离x最近的且小于x的数

单调栈 主要就是将一个序列 找到他的性质 将其单调化 如下:

我们可以把i左边的数全部加入栈中

然后 对该栈进行一些处理 把那些相对位置在左边的且较大的数弹出 这样 整个栈就变成了一个单调递增的栈 与新插入进来的数进行比较的时候就比较方便 (进行该步时 先暂时不考虑是否相等的问题 因为现在先处理的是研究点x放入之前的状态)

当x插入之后 将x栈顶元素(stktt)与x比较 当栈顶元素比x大的时候 就出栈(tt--) 直到找到某个元素小于x 这样即可

例题



使用 cin.tie(0)

ios::sync_with_stdio(false)

可以使输入输出提高效率

单调队列

主要思想

从原序列中 找到一个性质 可以让序列变单调

例题



二级目录

二级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

相关推荐
小程故事多_8010 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_9561219712 小时前
二分算法(知识点+题目)
c++·算法
AndrewHZ14 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场15 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶16 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾16 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI16 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
2501_9423895517 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
小程故事多_8017 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶17 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展