DS博客作业--线性表
0.PTA得分截图
1.本周学习总结
1.1 总结线性表内容
顺序表
1.结构体定义
- 顺序表的结构体一般由数组加长度组成
2.顺序表插入
- 顺序表的插入需要对结构体内的数组进行挪动以及对长度的修改
3.删除的代码操作
- 顺序表的删除同样需要对结构体内的数组进行挪动
链表
1.结构体定义
- 链表的一个结构体为一个节点,包含数据部分以及后继指针
2.头插法
- 头插法指将数据分别放到结点,从表头依次插入,这样存储的链表是倒序的
3.尾插法
- 头插法指将数据分别放到结点,从表尾依次插入,这样存储的链表是正序的
4.链表插入
- 链表插入需要先找到待插入点,然后将待插入结点的后继指针指向待插入处的后一个节点,再将待插入处的前一个节点的后继指针指向待插入接点即可
(如,有序链表插入元素e)
5.删除操作
- 链表删除需要先找到待删除点,然后将待删除结点的前一个结点的后继指针指向待删除结点的后一个结点,再删除(用delete()函数)即可
(如,有序链表删除元素e)
有序表
1.有序单链表数据插入、删除,有序表合并
有序单链表数据插入、删除在链表处有讲到且有举例,此处就不再说明
- 有序链表合并可以以其中一条链为模板,将另外一条链中的数据按顺序插入,期间再将相等的数据删除
循环链表、双链表结构特点
1.循环链表
- 循环链表的主要特点即链表尾部没有指向空,而是指向头结点,这样的好处是在任意一个结点处都有遍历整个链表的能力
2.双链表
- 双链表的主要特点是每一个结点不仅有后继指针,还有前驱指针,这样对链表的操作就更加方便快捷,链表上的指针可以向后挪动也可以向前挪动
1.2.谈谈你对线性表的认识及学习体会。
对线性表的认识
学完线性表,发现其不仅在数据的存储上能够做到即用即申请,用完即释放的效果,大大节省内存空间,而且,在对数据的处理上,也是方便许多,不用像数组一样有时需要遍历、挪动数组,节省时间。
学习体会
通过这个阶段的学习,对计算机内部的工作原理有有了新的认识,也越来越感受到计算机语言需要更加灵活的运用,才能发挥出它的效果和优势。
2.PTA实验作业
2.1.题目1:6-11 jmu-ds-链表分割
2.1.1代码截图
2.1.2本题PTA提交列表说明。
2.2.题目2:6-9 jmu-ds-有序链表合并
2.2.1代码截图
2.2.2本题PTA提交列表说明。
- 第一次审题不仔细,没有考虑到重复的情况
2.3.题目3:6-8 jmu-ds-链表倒数第m个数
2.3.1代码截图
2.3.2本题PTA提交列表说明。
Q1,没有考虑到m小于0的情况(同时提交了两次,所以错误了两次)
3.阅读代码(0--4分)
3.1 题目及解题代码
3.1.1 该题的设计思路
时间复杂度O(m + n) 空间复杂度O(1)
3.1.2 该题的伪代码
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
if(headA或headB之中有空表)
return nullptr;
定义两指针分别指向两个表头
while(两指针不等)
{
指针遍历两个链表,如果到表尾就到另外一条链上继续遍历
}
return 一个指针;
}
3.1.3 运行结果
3.1.4分析该题目解题优势及难点。
解题巧妙地运用了相交链表的长度差,通过两个指针同时遍历来找到相交结点,大大减少时间以及空间复杂度
3.2 两两交换链表中的节点
3.2.1 该题的设计思路
时间复杂度O(n) 空间复杂度O(1)
3.2.2 该题的伪代码
ListNode* swapPairs(ListNode* head)
{
if(为空表)return head;
定义指针1,2,3指向前三个结点
while(1){
swap(2->val,1->val);
if(后面没有数据)return head;
指针向后移两个结点
}
return head;
}
3.2.3 运行结果
3.2.4分析该题目解题优势及难点。
题目不难,但是要求对链表的操作很熟悉,解题用三个指针,通过遍历进行两两交换,代码很简洁,没有拖泥带水