zoukankan      html  css  js  c++  java
  • 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 学习体会

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

  • 相关阅读:
    leetcode66 plusOne
    park/unpark 阻塞与唤醒线程
    leetcode55 jumpGame贪心算法
    ACID特性与事务的隔离级别
    PCB ODB++(Gerber)图形绘制实现方法
    PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20
    PCB SQL SERVER 位运算应用实例
    PCB SQL SERVER 枚举分割函数(枚举值分解函数)
    PCB SQL SERVER 正则应用实例
    PCB Genesis 外形加内角孔实现方法
  • 原文地址:https://www.cnblogs.com/xycm/p/10627801.html
Copyright © 2011-2022 走看看