有很多的数据结构的底层都是基于数组和链表,所以我们要了解下数组、链表是怎么存储的,以及怎么去解决一些相关的letcode算法题,只有了解了真正的底层结构才能更进一步。
数组
概念
数组是固定长度内存中一段连续的存储空间,并且相同内存中是同一种数据类型的(int,string等)。
数组中的每一项我们称为元素,数组中的下标我们称为数组的索引。
数组查询
数组支持通过索引快速定位到元素,好比我们住的单元楼已经排好了序,我要找到指定的门牌号不用去挨个去找只需要有房间号即可找到对应的房间。
数组插入
数组插入:例如:给定数组如图所示插入索引为1的数据为5的数据,需要从index=2的数据都向后移动,并且对于原有数据进行扩容处理,但是在插入时由于数组的要求是连续的内存空间所以需要将指定的元素向后移动导致我们时间复杂度大大增加,所以说数组的插入有效率问题。
数组删除
数组删除:例如在如图所示的数组中删除下标为1的数据没需要我们将index=2的数据向左移动,并调整原有的index,需要新的数组来承接删除后的数据。
链表
概念
链表是一种表示一系列结点的数据结构。它由结点组成,每个结点包含结点值以及指向其他结点的指针。链表分为多种类型,包括单向链表、双向链表和循环链表。在链表中,每个结点的指针指向下一个结点,允许在表上任意位置插入和移除结点,但不支持随机访问。链表的内存结构是不连续的,通过将一组零散的内存块串联起来实现数据存储和操作。
最基础的链表一共包含了两个内容:一个是数据项、一个是指向下一个节点的指针、这两个加起来被称为结点、尾部节点为null可以判断使用。
链表查询
例如我们查询76时,需要从头节点开始挨个便利,最终去查询到数据,因为没有索引列所以它的时间复杂度是0(N)
链表插入
例如我们直接在俩表中插入16只需要将如图所示的43指向16的地址即可。
链表删除
链表删除只需要调整相应的指针即可操作。删除与插入同理。