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

算法--数据结构

这里写目录标题

  • 本节内容
  • 链表与邻接表
    • 链表
      • 主要思想
      • 链表操作
        • 初始化+在head结点后面插入
        • 普通插入
        • 删除操作
      • 例子
    • 双链表(双向循环链表)
      • 主要思想
      • 操作
        • 初始化+双向插入
        • 删除第k个点
    • 邻接表
      • 主要思想
  • 栈和队列
      • 主要思想
      • 主要操作
    • 队列
      • 主要思想
      • 操作
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

本节内容

在这里插入图片描述

链表与邻接表

链表

主要思想

在这里插入图片描述
因为用真正的链表来写算法的话 会new很多东西 而new的过程是非常慢的

所以我们要用数组来写链表
如上图 链表分为单链表和双链表 单链表主要是邻接表 主要作用是存储图和树

e[]数组用来存储各个结点的val值 而ne[]数组用来存储各个结点的next指针 而表示在数组里就是存储下一个结点的数组下标
最后的空地址用-1表示
head表示指向头结点的指针 实际上就是头结点的下标

!!所有的结点都在e[]数组里 但是他们的排序不是按照e[]的下标按照顺序连续排序的 他们的排序是一个链表 存在ne[]数组里
e[k] 是指下标为k的e[]数组中的值 也就是在e[]数组中 下标为k的值
ne[k] 是指在e[]数组中下标为k的结点 下一个结点在e[]数组中的位置(下标)
在这里插入图片描述
同时会定义一个int变量idx 存储当前操作的点的下标 实质上发挥着指针的作用
他会指针一个e[]数组中 最新的可用的位置 用来新建一个结点

链表操作

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

在这里插入图片描述
初始化就是将head改为-1 意思是head指向-1位置的空间 也就是空指针
然后idx可以更新为0 因为e[]数组中第一个可用位置就是下标为0的位置

插入
首先新建结点 e[idx]=x

之后next域指向头结点 ne[idx]=head
因为head存储的就是第一个数据的下标

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

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

普通插入

在这里插入图片描述
将x插入到下标是k的结点的后面

删除操作

在这里插入图片描述

在这里插入图片描述
注意中括号里就是存储的下标

!!所有的结点都在e[]数组里 但是他们的排序不是按照e[]的下标按照顺序连续排序的 他们的排序是一个链表 存在ne[]数组里
注意 k结点的下一个结点的下标不一定是k+1 而是ne[k] 这就是k结点的下一个结点在e[]数组中的下标

而e[]数组中的元素的位置排序 是按照生成的时间来排序的 因为生成一个结点就是在e[]数组中新建一个数据
比如 第k个插入的点 他的下标是k-1 这里说的就是在e[]数组中的下标

例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意光标所在行给了特判

双链表(双向循环链表)

主要思想

在这里插入图片描述
在单链表的基础上 加了两个指针域函数 一个是l[ ] 一个是r[ ]
在这里插入图片描述
因为是双向循环链表 可以让0号位置的空间是 头结点
1号位置是尾结点
这样的话 head的值就是0 tail(指向尾结点的指针)的值就是1

操作

初始化+双向插入

在这里插入图片描述
初始化 因为是循环链表 头结点和尾结点也是双向链接 所以 r[0]=1 l[1]=0;
同时 因为0 1 的位置被占用了 所以idx初始化是2

插入:
在下标为k的节点后面插入在这里插入图片描述
先新建结点 e[idx]=x
首先更新新节点的r 和 l
然后 更新两端结点的指针数组
先更新 右端点的 l[ ]数组 再更新左端点的 r[ ] 数组

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

在下标为k的点的左边插入
在这里插入图片描述
在k左边插入 实际上就是k的前一个结点的右边插入 所以改一下函数输入就行 add(l[k],x)

删除第k个点

在这里插入图片描述
将左边点的r 更新为 右边点的下标
将右边点的l 更新为 左边点的下标
在这里插入图片描述

邻接表

主要思想

在这里插入图片描述
就是将所有节点的邻节点用链表存了起来

栈和队列

主要思想

先进后出

主要操作

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

队列

主要思想

先进先出

操作

在这里插入图片描述
hh表示队头下标 tt表示队尾下标
tt初始化为-1)(这里不用再向栈一样用tt>0来判断是不是为空了 直接用hh<=tt 来判断是不是有元素 所以tt就可以初始化为-1 这样插入元素的时候 直接从下标0开始)
hh初始化为0
(不进行初始化 默认是0)

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

相关文章:

  • 如何卸载在linux下通过rpm安装的mysql
  • 常用的三角函数公式
  • 国产小体积超低成本电动车仪表智能刷卡解锁13.56M非接触式读写芯片CI522兼容替代RC522
  • URI 和 URL 的区别
  • 收银系统怎么选,网页版还是安装版好?
  • 大数据毕业设计选题推荐-河长制大数据监测平台-Hadoop-Spark-Hive
  • 普洱茶上市?澜沧古茶通过港股聆讯
  • 【完整详细】使用Alibaba Cloud Toolkit插件一键部署前后端分离项目
  • Direct3D地形绘制基础
  • scss 实用教程
  • VMware安装CentOS最小化开发环境导引
  • Spring 缓存注解这样用,太香了!
  • 基于8086汽车智能小车控制系统
  • 征服地球极限,中国极地科考与登峰事业的“御寒”之旅
  • 300.最长递增子序列
  • [NodeJS] 关于Buffer
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • ECMAScript6(0):ES6简明参考手册
  • express如何解决request entity too large问题
  • java多线程
  • PHP 小技巧
  • PHP的类修饰符与访问修饰符
  • tensorflow学习笔记3——MNIST应用篇
  • vue.js框架原理浅析
  • Vue.js源码(2):初探List Rendering
  • 包装类对象
  • 翻译:Hystrix - How To Use
  • 简单数学运算程序(不定期更新)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 一份游戏开发学习路线
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用jquery写贪吃蛇
  • Mac 上flink的安装与启动
  • 从如何停掉 Promise 链说起
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (1)STL算法之遍历容器
  • (13)Hive调优——动态分区导致的小文件问题
  • (floyd+补集) poj 3275
  • (二)Linux——Linux常用指令
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四) Graphivz 颜色选择
  • (推荐)叮当——中文语音对话机器人
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .dwp和.webpart的区别
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core中的去虚
  • .NET Framework .NET Core与 .NET 的区别