DS01——线性表
0.PTA得分截图
1.本周学习内容总结
1.1总结线性表内容
1.顺序表
-
顺序表结构体定义。存放数据以及表的长度
-
顺序表插入。遍历顺序表,找到需要插入的位置,并将该位置及之后的元素均向后移动一个位置
-
顺序表删除。遍历顺序表,找到需要删除的元素,将该元素之后的元素均向前挪动一个位置
-
顺序表重复元素删除。遍历两次顺序表,找到重复元素,然后操作删除
-
顺序表区间删除。遍历顺序表,找到区间内的元素,重新放入顺序表中,并定义自增变量,最后赋给顺序表长度
2.链表
-
链表结构体定义。存放数据以及创建后继节点
-
链表头插法。将每个节点放在头结点之后
-
链表尾插法。将每个节点放在链表末端
-
链表插入。找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点
-
链表删除。找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点
3.有序表
-
有序表单链表插入。遍历有序表,找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点,有插入到末尾的情况
-
有序表单链表删除。遍历有序表,找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点
-
有序表单链表合并。遍历两个单链表,并比较相应元素的大小,哪个链表中相应比较大,就将其放入新建列表中,并指向下一个节点,若元素大小相等,则将该元素放入新建列表里,两个链表元素指向下一个节点
4.循环链表、双链表
- 循环链表:将表中尾结点的指针域改为指向表头结点,整个链表形成一个环。由此从表中任一结点出发均可找到链表中其他结点。
- 双链表:从任一结点出发可以快速找到其前驱结点和后继结点,。从任一结点出发可以访问其他结点。
- 双链表的插入及删除。前驱以及后继的关系均要改变
- 带头结点的循环单链表和循环双链表
1.2对线性表的认识及学习体会
本章学了线性表及线性表的各种运算,例如插入、删除等。线性表主要有顺序表和链表两种,而链表又有单、双、循环链表。
根据上述总结可以看出各自的优缺点:顺序表可以很快的找到相应的节点,但比较浪费空间,在处理大量元素时效率就显得低下。
链表对相邻两个数据之间用结点中的指针来指示,不要求逻辑上相邻的两个元素存储的物理空间相邻,对碎片空间的利用率高。
对于线性表的学习,我感觉我还是比较吃力的。上学期的关于链表的知识在现在又重新被激活,又增加了许多知识。
我总是会在链表的操作上栽跟头,还是很不熟练,真的需要代码量来填补。做pta时不能够举一反三,还是对链表理解不够深,需要多多练习。
2.PTA实验作业
2.1jmu-ds-有序链表合并
2.1.1代码截图
2.1.2本题PTA提交列表说明
- 刚开始没有注意重复的这种情况,改了几次后添了对重复这种情况的操作后就正确了。
2.2jmu-ds-链表分割
2.2.1代码截图
2.2.2本题PTA提交列表说明
- 刚开始是在一次循环中操作两次,即没有if判断条件,第一次操作L1,第二次操作L2,后来发现这样十分容易出错。问了同学之后,定义flag变量,交替操作就通过了。
2.3 jmu-ds-链表区间删除
2.3.1代码截图
2.3.2本题PTA提交列表说明
刚开始看到了需要排序,但是我不知道怎么插入排序,于是我先输入数据,在排序,期间排序错误,部分正确,后来发现删除函数也有些错误,改过来之后就对了。后来发现其实改一下就是输入插入排序了,如下
3.阅读代码
3.1题目及解题代码
3.1.1该题的设计思路
该题是一个循环链表,时间复杂度为O(n),空间复杂度为O(1)
3.1.2该题的伪代码
建立一个循环链表
while (p->next != p) 遍历循环链表
{
找到每三个人的第三个人
杀死该人即删掉该节点
输出被杀掉的人
p->next = p->next->next; //将该节点从链表上删除。
p = p->next;节点移动
}
3.1.3运行结果
3.1.4题目解题优势及难点
- 优势:改代码用了循环链表,整体代码不是特别难懂,所以并无突出的特点,但该代码也拓宽了思维
- 难点:将问题转化为循环链表,我们学习主要学习单链表,而循环链表以及双链表只是浅显学了,很少用他们,所以在面对这种题是肯不知道如何去做。题目简单,但其实可以改为n个人排成圈,第m个人自杀。
3.2题目及解题代码
3.2.1该题的设计思路
时间复杂度为O(n)空间复杂度为O(1)
3.2.2该题的伪代码
while(指针不为空)
{
oddList->next = evenList->next 下标为单数的节点相互连接
evenList->next = oddList->next->next 下标为双数的节点相互连接
oddList = oddList->next;
evenList = evenList->next;指针指向下一个节点
}
单标链后接上双标链
3.2.3运行结果
3.2.4题目解题优势及难点
- 优点:直接用两个指针操作,一个指向单标的节点,一个指向双标的节点,利用相互关系,操作十分简单。用一个指针存放第二个节点,便于之后两个链的连接
- 难点:该代码使用的指针是不带头结点的链表,我们学习的一般都是带头结点的链表,所以读起来会有些别扭,实际上我的运行结果是我把他的链表变为带头结点的链表的结果。