数据结构篇_编程思想板块_第一章顺序表和链表
编程思想板块最主要的内容是数据结构经典题目及解答题目所需的编程思想,愿对您能有所帮助
| 各数据结构程序名称 | |
|---|---|
| 顺序表 | Sqlist |
| 链表结点 | LinkList(结构体类型指针,malloc处不用加*)LNode(结构体类型对象) |
| 顺序栈链式栈 | SqStake,LiStake(结构体类型指针,malloc处不用加*) |
| 顺序队列链式队列 | SqQueue,LinkQueue |
| 顺序串堆中串链式串KMP算法中 | SString,HString,LinkString,String |
| 链式二叉树线索二叉树双亲表示法时的树孩子兄弟表示法时的树 | BiTNode,*BiTree(指向根节点,下同)ThreadNode,*ThreadTree,PTree,CSNode,*CSTree |
| 邻接矩阵存储图邻接表存储图图遍历 | MGraph,ALGraph,Graph |
| 顺序查找折半查找 | SSTable,SeqList |
一、顺序表和链表
① 若以线性表表示集合并进行集合的各种运算,应先对表中元素进行排序
② 常考将两个有序链表合成一个新的有序表
③ 在这一章中哈希表的思想很常用
④ 注意:代码后记得要更新length值
⑤ 逆置的常见方法:
(1) 头插法
(2) 递归
(3) 借助栈
⑥ 链表中:
(1) 前插操作时:将待插入结点s依旧插入P后面,然后交换s和p的值,此时时间复杂度为O(1)
(2) 删除结点p:将后继结点的值赋给自己p,然后删除后继结点,此时时间复杂度为O(1)
(3) 若题目中只要求在时间上尽可能高效,则采用空间换时间的方法
1)顺序表经典题目的编程思想
1. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为x的数据元素(经典的顺序表删除元素的方法)
思想:
① 用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k,并将不等于x的元数向前移动k个位置(初始k=0),最后修改L的长度
② 用k记录顺序表L中等于x的元素个数,边扫描L边统计k,并将不等于x的元素前移k个位置,最后修改L的长度
2. 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同(若为无序的可用哈希表解决)
思想:
① 用类似于直接插入排序的思想,初始时将第一个元素视为非重复的有序表。之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,若相同,则继续问后判断,若个同,则插入前面的非重复有序表最后,直至判断到表尾为止
3. 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表
思想:
① 首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中。然后,看哪个表还有剩余,将剩下的部分加到新的癞序表后面
4. 已知在一维数组A[m+n]中依次存放两个线性表(a,a2,...,am)和(b1,b2,b3,..,bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,..,bn)放在(a,a2,...,am)的前面
思想:
5.
思想:
6. 一个长度为L(L≥1)的升序序列S,处在第向上取整(L/2)个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19)则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8, 20),则S1和S2的中位数是11.现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数
思想:
① 分别求两个升序序列A、B的中位数,设为a和b,求序列A、B的中位数过程如下
(1) 若a
(2) 若a>b、则舍弃序列A中较大的一半,同时舍弃序列B中较小的--半,要求两次舍弃的长度相等
(3) 若a=b,则α或b即为所求中位数,算法结束
(4) 在保留的两个升序序列中,重复过程①、②、③,直到两个序列中均只含一个元素时为止,较小者即为所求的中位数
7. 已知一个整数序列A=(a_0,a_1,...,a_(n-1)),其中0≤a_i
思想:
① 给出算法的基本设计思想:算法的策略是从前向后扫描数组元繁,杯记出一个可能成为主元素的元素Num。然后重新计数,确认 Num是否是主元素。算法可分为以下两步:(摩尔投票法)
(1) 选取候选的主元素。依次扫描所给数组中的每个整数,将第一个遇到的整数Num保存到c中,记录 Num 的出现次数为1;若遇到的下一个整数仍等于 Num,则计数加1,否则计数减1:当计数减到0时,将遇到的下一个整数保存到c中,计数重新记为1,开始新一轮计数,即从当前位置开始重复上述过程,直到扫描完全部数组元素
(2) 判断c中元素是否是真正的主元素。再次扫描该数组,统计c中元素出现的次数,若大于n/2,则为主元素:否则,序列中不存在主元素
8. 给定一个含n(n≥I)个整数的数组,请攻订一个杜时间一公马)向效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是l;数组{1,2,3}中未出现的最小正整数是4
思想:
① 要求在时间上尽可能高效,因此采用空问换时间的办法。分配一个用于标记的数组B[n]用来记录A中是否出现了1~n中的正整数,B[0]对应正整数1,B[n-1]对应正整数n,初始化B中全部为0。由于A中含有n个整数,因此可能返回的值是 1n+1,当A中n个数恰好为1n 时返回n+1。当数组A中出现了小于等于0或大于n的值时,会导致1~~n中出现空余位置,返回结果必然在1~n中,因此对于A中出现了小于等于0或大于n的值,可以不采取任何操作