DS博客作业02--线性表
1.思维导图及学习体会
1.1思维导图
1.2.1学习体会
经过一周的学习,我发现自己在做某些问题时比较费时间,比如在有序表中找到相应节点进行删除插入以及顺序表表中进行删除插入。所以提高熟练度很重要,应该先把书上的代码搞清楚,然后再练练pta。在做线性表的操作时,一定要用好方法,脑海中要有思路,对自己的步骤进行到哪一步要了如指掌。还有就是要避免一些像忘记申请空间、忘记判断链表为空之类的常见的错误。在编程过程中尽量减小时间复杂度也是非常重要的。
2.PTA实验作业
2.1题目一:顺序表删除重复元素
2.1.1设计思路
定义 i,j=1,m=1,d等于链表长度
建立新链La
La的头结点=L的头结点
while m小于d
for i=0 to i小于m then
if L->[m]等于L->data[i] then 循环结束
if i 大等于 m then
La->data[j]=L->data[m]
j++
m++
循环结束
L=La
if (d不等于0) then L的长度等于j
2.1.2代码截图
2.1.3本题PTA提交列表说明
- Q1:这道题用m遍历链表,并让m与其前面的数做比较的方法来查重,若无异常则m存入新链。但是运算出来的结果总出错。
- A1:后来发现循环退出那块没写好,导致结果错误,最后弄清楚了。
- Q2:最后一个测试点过不去,不知道空表的时候该输出什么。
- A2:当链表为空时,应该不做任何操作。
2.2题目二:链表倒数第m个数
2.2.1设计思路
定义 i
定义指针 P1、P2
P2等于L的头结点
P1等于NULL
for i=1 to P2不等于NULL
if i等于m then P1等于L的头指针
else if i大于m且m>0 then P1等于P1->next
P2等于P2->next
结束循环
if P1等于NULL then 返回-1
否则返回 P1的data
2.2.2代码截图
2.2.3本题PTA提交列表说明
- Q:刚写的时候,不管怎么改第一个和第二三个测试点不能同时正确。
- A:后面发现是少考虑了m小于0的情况
2.3题目三:有序链表合并
2.3.1设计思路
定义p1,p2,L3,r
p1等于L1头指针
p2等于L2头指针
r等于L3
while p1和p2不等于NULL
if p1->data小于p2->data then
r->next等于p1
r等于p1
p1等于p1->next
else if p1->data大于p2->data then
r->next等于p2
r等于p2
p2等于p2->next
else
p1等于p1->next
循环结束
if p1不等于NULL then
r->next等于p1
if p2不等于NULL then
r->next等于p2
L1等于L3
2.3.2代码截图
2.3.3本题PTA提交列表说明
- Q:刚写的时候没看清,以为题目是没有顺序的,想了好多复杂的做法。
- A:后来看见是题目是有序表,和课堂派上的题目很相近
3.阅读代码
该问题要求结果链表按元素值递减次序排列。故在合并的同时,将链表结点逆置。
3.1解题思路
先令pa,pb为la,lb的工作指针,然后一个个比较两链表元素的大小,较小者用头插法链入结果表,同时完成了逆置。当其中一个链表结束了,就把另一个链表链入结果表
3.2代码截图
3.3学习体会
上面两链表均不为空的表达式也可简写为while(pa&&pb)。上面的算法是边合并边逆置,比起先合并后逆置的做法更加优化。题中将pa,pb的后继结点暂存于r,防止链路出错,保证了头插法的实现。最后两个while语句将剩下的那个链表逆置插入结果表中,值得学习。