钟海清

导航

DS博客作业02--线性表

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 学习体会

- 感觉编程也有不少数学的应用,善用数学思想,可以大大简化代码
- 通过搜索网站了解到更多自己还不知道的知识点,掌握多点知识

posted on 2019-03-31 15:01  haiqingz  阅读(233)  评论(0编辑  收藏  举报