DS博客作业02--线性表
1.本周学习总结
1.1思维导图
1.2.谈谈你对线性表的认识及学习体会
线性表的很多操作都有多种实现方法,在这些操作方法之间我们要尽量选择一种最优的方法,这就对个人的思维能力有一定要求。而在对线性表进行操作时,有一些细节也要特别注意,比如说链表中指针域的指向,我在对链表进行操作时就经常忽略指针的指向已经改变而导致出错。
2.PTA实验作业
2.1.题目1:一元多项式的乘法与加法运算
2.1.1设计思路
相加:等同于两个有序链表合并,只有在两个指数相同的节点需要特别处理
相乘:取第一个多项式的一个节点,与另一个多项式的所有节点相乘,用临时链表储存相乘后的结果,再把所有的临时链表合并
void AddList(LinkList &add, LinkList L1, LinkList L2)//相加
{
LinkList p, r;
add添加头节点(初始化);
while L1&&L2 do
p=new LNode;
比较两个链表的节点的指数大小,p的值等于指数较大节点的值
若指数相同,则p的常数值等于两个节点的常数值相加,若相加后常数值为0则删去此节点
add->next = p;
add = p;//尾插法建链表
end while
将两个多项式剩余的项复制到add上
}
void MultiplyList(LinkList &mulitiply, LinkList L1, LinkList L2)//相乘
{
LinkList temp, p, r, s;
mulitiply添加头节点(初始化);
若L1或L2有1个为空(0多项式),则返回
while L2 do
初始化临时链表temp
p=L1;
用L2的一个项分别与L1的所有项相乘,并把结果存入临时链表temp
将临时链表temp与mulitiply合并
end while
}
2.1.2代码截图
2.1.3本题PTA提交列表说明
- Q1:合并同类项项时系数为0的情况未处理
- A1:在合并同类项时多加一个判断就可以解决了
本题我最开始是用数组来做的,后来才改成用链表来做的,虽然数组解法会造成时间和空间的浪费,但数组解法相较于链表解法来说对程序员相对友好,写和调试会相对比较容易(我数组解法代码60多行,链表解法160多行且调试的时候修bug修到心累)
(修bug这种事,其实就是电脑难受,但它不告诉你那里难受,你必须自己找出它哪里难受,还必须判断它为什么难受,最后再对症下药--一个修bug修到心累的码农的真实体会)
2.2题目2: jmu-ds-单链表逆置
2.2.1设计思路
遍历原链表,遍历的同时取原链表的节点,用头插法建立新链表
void ReverseList(LinkList &L)//逆转链表
{
若链表为空则返回
取原链表的第一个节点作为新链表的第一个节点
while p != NULL do//遍历原链表并用头插法建立新链表
r = p->next;
p->next = L;
L = p;
p = r;
end while
为新链表添加头节点
}
2.2.2代码截图
2.2.3本题PTA提交列表说明
本题我也用了两种解法来做,但其实两种解法在本质上并无差别,原解法我是取原链表的值来建立新链表的,而新解法我是直接用原链表的节点来建立新链表
2.3题目3:jmu-ds-有序链表的插入删除
其实链表的插入删除算是基础操作了,只不过要特别注意一下操作的位置
void ListInsert(LinkList &L, ElemType e)//有序链表插入元素e
{
遍历链表并寻找插入位置
pNew = new LNode;
pNew->data = e;
pNew->next = p->next;//若插入位置在链表末尾则下一个节点改为NULL
p->next = pNew;
return;//插入节点并返回
}
void ListDelete(LinkList &L, ElemType e)//链表删除元素e
{
若链表为空则返回
遍历链表并寻找要删除的节点
若找到,则
s = p->next;
p->next = p->next->next;
delete s;
return;//删除节点并返回
若未找到,则输出’未找到!‘并返回
}
2.3.2代码截图
2.3.3本题PTA提交列表说明
(其实本来这道题我是打算选有序链表合并的,但有序链表合并的方法我在多项式那一题其实已经讲得差不多了,只好选择这一题了)
3.阅读代码
3.1 题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
3.2 解题思路
用快慢指针法找到链表的中间节点,之后逆转链表的后半部分,最后再比较链表的前半部分与后半部分是否相同
(我的思路是复制一个原链表并将其逆置,之后再与原链表进行比较是否相同)
3.3 代码截图
3.4 学习体会
时常去逛一逛这些网站对自己的编程能力提升还是很有帮助的,特别是看一堆大佬在讨论如何更快的解决题目,对比自己的解法与他们的解法的优劣,学习优秀的解法以提高自己的编程能力,又因为别人解题所用的语言不只一种,我们还可以顺便学习一下其他语言。