DS博客作业02—线性表
1.本章学习总结
1.1 思维导图
1.2学习体会
学习了线性表的相关内容,接触到了抽象数据类型这个概念。对于我来说线性表的内容有点抽象,就像绳子打结一样,纠结。在预习的时候主要是看书本上的例题和注释,PTA上的题目有一些都是书上原样写下来的。
链表和顺序表相比我觉得更容易理解一点,因为感觉它更形象,就是双链表和循环链表有点不太明白。特别的就是对程序的时间复杂度还停留在一个循环一个n,两个嵌套循环n平方的阶段。。
2.PTA实验作业
2.1.题目1:题目名称
6-7 jmu-ds-单链表逆置 (15 分)
2.1.1设计思路(伪代码)
思路:遍历链表,让原链表的每一个节点元素插入到新链表里面
代码:
定义两个节点p和q;
给p申请空间;
并且让p的下一个节点置为空
while(遍历链表)
申请循环节点
L=L的next
循环赋值L的data给q的data
把p的next节点接在q的后面
让q又能和p循环
最后让L=p的头
2.1.2代码截图
2.1.3本题PTA提交列表说明
一开始想着这个思路就去打了,不过发现发现测试点过不去,后面问了下室友发现了问题改了几次踩过了
2.2.题目2:题目名称
6-8 jmu-ds-链表倒数第m个数 (20 分)
2.2.1设计思路(伪代码)
思路:先找到链表的长度,最后用一个循环找到长度减m+1就是倒数第m个数
伪代码:
定义一个节点p,和长度变量len,让p始终为L的头
while遍历链表得到链表长度len
if(m>len||m<=0)
{
return error排除错误 }
for(int i=0;i<len-m+1;i++)
L=L->next;
return 找到的第m个数据
2.2.2代码截图
2.2.3本题PTA提交列表说明
个人觉得这个还是听好做的特别是如果是数组的话就感觉还行,换链表的话就出现了问题有错误或者m的值没有考虑到,在dev上检查了几次还好找到了
2.3.题目3:题目名称
6-10 jmu-ds-有序链表的插入删除 (15 分)
2.3.1设计思路(伪代码)
思路:因为是有序表,所以只需要遍历并且同时把e与各个元素比较找到那个插入的位置,同时记录下当时的位置,把数据插入就好了;
需要一个是否删除成功的标志flag,同样遍历链表,比较当与输入e相同的数据时把那个节点的前一个与后一个接起来达到删除的目的
伪代码:
定义节点p和pre,和标志变量flag,让p始终为L的头
while遍历链表
iif(ep->next->data)
flag变化
p->next接到pre后
pre->next接到p->next后
break;
}
p=p->next;
if(l链表为空)无返回
if(flag0)
cout找不到
2.3.2代码截图
2.3.3本题PTA提交列表说明
这个题目感觉是前面两个小题和起来协调一下函数就还好,不过实际操作嘛emmm不是那么好做,不过发现两个函数其实很像,就是在最关键的那一句代码换一下,再在结尾的节点头换一下就好了
3、阅读代码
3.1 题目
6-7 jmu-ds-单链表逆置 (15 分)
3.2 解题思路
思路:利用before和p实现两个节点之间的逆转,原先是before下一个指向p,修改成p下一个指向before,有点像上学期的两个元素互换位置用个index那种做法
3.3 代码截图
3.4 学习体会
我在解这个题的时候想法和这个很像,不过这个就很形象(像一对人在排队,教官说向后转那种感觉),我那个就感觉有点昏昏的。。