DS博客作业02--线性表

1.本周学习总结

1.1思维导图

DS博客作业02--线性表_第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代码截图

DS博客作业02--线性表_第2张图片
DS博客作业02--线性表_第3张图片

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代码截图

DS博客作业02--线性表_第4张图片

2.2.3本题PTA提交列表说明

DS博客作业02--线性表_第5张图片
本题我也用了两种解法来做,但其实两种解法在本质上并无差别,原解法我是取原链表的值来建立新链表的,而新解法我是直接用原链表的节点来建立新链表

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代码截图

DS博客作业02--线性表_第6张图片
DS博客作业02--线性表_第7张图片

2.3.3本题PTA提交列表说明


(其实本来这道题我是打算选有序链表合并的,但有序链表合并的方法我在多项式那一题其实已经讲得差不多了,只好选择这一题了)

3.阅读代码

3.1 题目

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true

3.2 解题思路

用快慢指针法找到链表的中间节点,之后逆转链表的后半部分,最后再比较链表的前半部分与后半部分是否相同
(我的思路是复制一个原链表并将其逆置,之后再与原链表进行比较是否相同)

3.3 代码截图

DS博客作业02--线性表_第8张图片

3.4 学习体会

时常去逛一逛这些网站对自己的编程能力提升还是很有帮助的,特别是看一堆大佬在讨论如何更快的解决题目,对比自己的解法与他们的解法的优劣,学习优秀的解法以提高自己的编程能力,又因为别人解题所用的语言不只一种,我们还可以顺便学习一下其他语言。

你可能感兴趣的:(DS博客作业02--线性表)