- 链表
每个数据都有一个指针,指向下一个数据的内存地址。
链表中,数据分散储存,因此只能逐个访问数据。
要增删数据,只需要改变数据之间的指针。
【拓展】①普通列表最后一个数据没有指针,但可以添加一个指针指向头部,叫循环链表。
②可以添加反向的指针,实现反向便历数据,叫双向链表。 - 数组
数组元素按顺序储存在连续的内存中,每个元素都有编号,可以通过编号直接访问数组元素。
但要在特定位置增删数组元素很麻烦,需要移动其他元素。 - 栈
栈是一种线形数据,只能访问到最新的数据。有入栈(push)和出栈(pop)两种操作。要访问中间的数据,必须要对顶上的数据进行出栈操作。 - 队列
与栈类似,从队列头添加数据,从队列尾取出(删除)数据。
先来的数据先处理,FIFO - 哈希表
先准备N维数组,再用哈希函数计算每个数据的哈希值,再除以数组的长度N,取余数mod,并把该数据放进第mod个地址中。如果有多个数据的mod值相同,发生哈希表冲突,则在相应的地址后面生成链表依次存储。
【拓展】还有一种解决冲突的办法,候补地址法,当冲突发生时,计算出数组中的候补地址,将数据存储进去。 - 堆
排列方式从上到下从左到右,每个节点两个子节点。规定子节点必须大于父节点。新增子节点若小于父节点,则与父节点调换位置,以此类推。堆顶数据永远是最小值。重构树的时间复杂度为O(logn)。
- 二叉树
每个节点有两个子节点,对某个确定的节点,其值大于左子树的任意值,小于右子树的任意值。其实二叉数是二分查找法的具象体现,增加数据时从第一个节点开始比对,小则向左,大则向右,以此类推。删除数据时,若没有子节点直接删除。若有一个子节点,则子节点连接待删除数据的父节点。若有两个子节点,则寻找左子树中最大值补充。查找节点方法与增加节点类似。