数据结构复习(2)
线性表章节。
线性表的定义和操作
线性表的定义
线性表是具有相同数据类型的 n 个数据元素的有限序列。
线性表是逻辑结构,表示了元素之间一对一的相邻关系。而顺序表(顺序存取表)和链表(链式存储表)是指存储结构。
- 线性表具有先后顺序。
- 线性表每个元素具有相同大小的存储空间。
线性表的操作
有以下操作:
- 初始化分配内存空间。
- 求表长。
- 按值查找。
- 读取某个元素。
- 插入操作。
- 删除操作
- 顺序输出所有元素。
- 判断元素个数是否为 0。
- 销毁线性表。
线性表的顺序实现
概念
顺序表是指,逻辑上相邻的数据元素在物理地址上也相邻。
结论就是:
随机存取方便,插入删除困难,顺序表是一种随机存取的数据结构。
例题遇到的概念
没什么好说的,连续多次删除元素的话不一定要重复 k 次的移动,可以一次移动完。具体算法思路是这样的:
- 定义一个下表 index=0 和循环变量 i=0。
- 循环遍历:
- 如果该元素要被删除,则不作任何操作。
- 如果该元素不会被删除,把它存入下标为 index 的数组,并使得 index++。
- 结束循环
- 最后让长度 = index 即可。
或者用下面的思路:
- 记录要删除元素个数,维护 k。
- 循环遍历:
- 如果该元素要被删除,则 k++。
- 如果该元素不被删除,则存入下标为 i-k 的数组当中。
- 结束循环
- 最后让长度 -= k。
循环左移或者循环右移的思路:
主要是空间复杂度怎么优秀起来,其实可以直接把数组 reverse 一下。然后选取一个点 k,让 (0,k) reverse,(k+1,n-1) reverse,这样相当于循环右移了 k+1 位。
让 n=5,k=0 试试看。
初始
1 | 0 1 2 3 4 |
全部 reverse 一下。
1 | 4 3 2 1 0 |
让 (0,0) reverse,(1,4)reverse。
1 | 4 0 1 2 3 |
就是循环右移了 k+1 也就是 1 位。
k=1的时候,在
1 | 4 3 2 1 0 |
的情况下,让(0,1)reverse,让(2,4) reverse,就变成了:
1 | 3 4 0 1 2 |
相当于是右移了 2 位。
线性表的链式实现
概念
没有难的地方,把头节点想象为一个不带值的节点即可,循环链表的最后一个 next 域要指向头节点。
如果不带头节点,那么那节点直接是指向第一个元素的。
举个例子就是:
有一个头指针 LinkList head,如果带头节点,那么 head->next->value
是第一个节点的值。如果不带头节点,那么 head->value
就是第一个节点的值。
- 静态链表:参考链式前向星,链式前向星就是很经典的静态链表。
然后就是,对于单链表来说,删除节点需要知道该节点的前一个地址。
其它就没什么了,都很 easy。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xia0ji233's blog!