1.本周学习总结
1.1思维导图
1.2认识及学习体会
这章内容总体感觉并不难,基本设计思路和链表的做法挺像的,但是顺序表与数组的做法会更相似一点。在查找元素方面,顺序表是比链表更方便的,但在删除和插入元素上,链表的优势则很明显,顺序表需要移动数组,在时间复杂度上会更大一些,链表则创建或删除一个节点就可以。此次对链表的学习,知道还有头插法这种做法,那么使链表的逆序输出就变得非常方便。
2.PTA实验作业
2.1.题目1:顺序表删除重复元素
2.1.1设计思路
定义变量i,j,k //i,j用于查找元素,k用于记录重构顺序表的下标
定义变量flag判断该数是不是重复元素
for i = 0 to i < L->length
给flag赋值为1,后面如果碰到重复数则改为0,然后不放入重构的顺序表
for j = 0 to j < k //和已存入新表的元素进行比较
if (下标为j对应的数据大于下标为i的)
flag = 0;
break;
end if
end for
if (flag) 将下标为i的数据存入重构的顺序表,并让k自增
end for
k的值就是重构的顺序表的长度
2.1.2代码截图
2.1.3本题PTA提交列表说明。
Q:在编译器运行的时候,总是不能把所有的数据输出来
A:一开始理解错了重构,第二个for循环并不能起到删除完重复数据的作用,改用将该数和已存入重构表中的数据比较即可
2.2 题目2:链表倒数第m个数
2.2.1设计思路
定义指针p,q并让L->next的地址给他们
定义变量count记录链表的长度,并赋初值为0
if(m<0)位置不合法,直接返回-1
while (p不为空)//计算链表长度
p 指针往下移
count++
end while
if(count=0)空表,返回-1
定义变量 k = count - m+1表示正数第k个位置
if (k表示的位置在链表长度合理范围内)
for ( i = 1 to i <= k)
if (i == k) q对应位置上的数据
q指针往下移
end for
end if
else 返回-1
2.2.2代码截图
2.2.3提交列表
Q1:第一次两个位置无效都错误
A1:没有考虑m表示的位置不合法的情况
Q2:第二次还是有一个位置无效的测试点过不了
A2:一直以为是返回-1出了问题,后面发现是p和q应该指向L的next而不是L
Q3:上问中有效位置没错而无效位置却有问题
A3:第一个循环多走了一步,而后面的循环少走了一步导致有效位置是对的,而无效位置则有问题了
2.3 题目3:有序表插入数据
2.3.1设计思路
创建链表
插入数据
定义变量 i 和 k //k记录下x需要插入的位置
while (i < L->length)
if (需要插入的数不大于第i个位置上的数)
break;
end if
end while
找到插入位置,length长度加一
for (k = L->length - 1 to k > i)//移动元素
将下标为k-1的数的值赋给下标为k的数
end for
将x的值插入到下标为 i 的位置
输出链表
2.3.2代码截图
2.3.3提交列表
Q1:出现编译错误
A1:把语言编译器改为c++即可
Q2:顺序表为空的时候答案错误
A2:忘记讨论空表输出ERROR的情况了
3、阅读代码
3.1 题目
判断一个链表中是否有环,是则返回 true,否则返回 false
3.2 解题思路
定义快慢指针,如果有环,最终快慢指针会在非空区域相遇
注:用到fast->next前先要确保fast不为空,要用fast->next->next前先要确保fast,fast->next不为空
复杂度:时间O(n), 空间O(1)
代码思路:fast指针一次性移动两次,slow指针一次性移动一次,如果有环的话,两个指针则最终会指向同一位置
3.3 代码截图
3.4 学习体会
- 感觉编程也有不少数学的应用,善用数学思想,可以大大简化代码
- 通过搜索网站了解到更多自己还不知道的知识点,掌握多点知识