1.本周学习总结(0--2分)
1.1思维导图
1.2.谈谈你对线性表的认识及学习体会。
线性表是由n个数据元素组成的有限序列。
1.线性表的结点可以是单值元素
2.线性表中的结点可以是记录型元素,每个元素含有多个数据项。
在学习数据结构线性表使用到很多的指针,和new的内存分配;
接触了这一段时间的线性表发现链表的很多优点,适合随机的插入和删除操作;
存储空间大小不需要提前设定,可以进行动态存储。
这次的pta作业,有很多是书上有的,我们现在还处于理解线性表的过程,理解算法!
现阶段需要的就是去理解优秀的代码,用于充实我们的知识。
2.PTA实验作业(6分)
2.1.题目1:题目名称
要求实现3个函数,在递增的顺序表中插入一个新整数,并保持该顺序表的有序性。
2.1.1设计思路(伪代码)
遍历顺序表,找到位置并且做到顺序插入
定义 俩个变量 i,j
循环for i n次、
if date[i] 大于被插入数x //找到位置
for j n 到 i 次
将i位置以后的元素都右移1位
L->data[i]=x 将数插入
2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.1.3本题PTA提交列表说明。
Q1:出现的问题有X的值在第一和最后的时候出错的问题
2.2 题目2
已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。
2.2.1设计思路(伪代码)
定义一个p为L的下一个
统计链表长度 p=p->next
查找要找的结点
i=length-m+1;
返回值 return p->data
2.2.2代码截图
2.2.3本题PTA提交列表说明。
Q1:在DEV上调试的时候,忽略了p指针初始化,查找结点过程并不是很顺利
2.3 题目3
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
2.3.1设计思路
定义所需要的循环变量
for i n次
L->data[i]=a[i] 遍历顺序表
if L->length0 L为空的时候 返回输出error
else
for i=1 to L->length 输出L->data[i]
删除重复数据,数据前移
for j=L->length-1 to 0
flag = 0
for k=j-1 to 0
if L->data[j]L->data[k]
flag = 1 用于判断是否有重复数据
while i大等0
L->data[j++]=a[i--]
2.3.2代码截图
2.3.3本题PTA提交列表说明。
Q1:编译问题是发生在变量名打错的缘故
Q2:一开始没有考虑到空表的情况,出现了错误
3、阅读代码(-2--2分)
3.1 题目
链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL
3.2 解题思路
方法一:输出到数组
思路和算法
按顺序将每个结点放入数组 A 中。然后中间结点就是 A[A.Length/2],因为我们可以通过索引检索每个结点。
方法二:快慢指针法
思路和算法
当用慢指针 slow 遍历列表时,让另一个指针 fast 的速度是它的两倍。当 fast 到达列表的末尾时,slow 必然位于中间。
3.3 代码截图
方法一:输出到数组
方法二:快慢指针法
3.4 学习体会
方法一:输出到数组
时间复杂度:O(N)O(N),其中 NN 是给定列表中的结点数目。
空间复杂度:O(N)O(N),A 用去的空间
方法二:快慢指针法
时间复杂度:O(N)O(N),其中 NN 是给定列表的结点数目
空间复杂度:O(1)O(1),slow 和 fast 用去的空间。
一般来说方法一是大家比较普遍的一种做法,但是在代码的优劣性上来讲方法二在时间复杂度不变
的情况下空间复杂度更低。这一题的代码虽然比较简单,但是给我的影响还是很大的,一个简单的问
题,用更简洁的方式去优化让代码有了更大的提升。对于一个给定的算法,我们通常要做两项分析:
第一是从数学上证明算法的正确性,第二就是分析算法的时间复杂度。这一题让我更加懂得去研究一
种算法是否更加的合理优化。