DS01——线性表

Posted xingyufen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS01——线性表相关的知识,希望对你有一定的参考价值。

0.PTA得分截图

技术图片

1.本周学习内容总结

1.1总结线性表内容

1.顺序表

  • 顺序表结构体定义。存放数据以及表的长度
    技术图片

  • 顺序表插入。遍历顺序表,找到需要插入的位置,并将该位置及之后的元素均向后移动一个位置
    技术图片

  • 顺序表删除。遍历顺序表,找到需要删除的元素,将该元素之后的元素均向前挪动一个位置
    技术图片

  • 顺序表重复元素删除。遍历两次顺序表,找到重复元素,然后操作删除
    技术图片

  • 顺序表区间删除。遍历顺序表,找到区间内的元素,重新放入顺序表中,并定义自增变量,最后赋给顺序表长度
    技术图片

2.链表

  • 链表结构体定义。存放数据以及创建后继节点
    技术图片

  • 链表头插法。将每个节点放在头结点之后
    技术图片
    技术图片

  • 链表尾插法。将每个节点放在链表末端
    技术图片
    技术图片

  • 链表插入。找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点
    技术图片

  • 链表删除。找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点
    技术图片

3.有序表

  • 有序表单链表插入。遍历有序表,找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点,有插入到末尾的情况
    技术图片

  • 有序表单链表删除。遍历有序表,找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点
    技术图片

  • 有序表单链表合并。遍历两个单链表,并比较相应元素的大小,哪个链表中相应比较大,就将其放入新建列表中,并指向下一个节点,若元素大小相等,则将该元素放入新建列表里,两个链表元素指向下一个节点
    技术图片
    技术图片
    技术图片

4.循环链表、双链表

  • 循环链表:将表中尾结点的指针域改为指向表头结点,整个链表形成一个环。由此从表中任一结点出发均可找到链表中其他结点。
    技术图片
  • 双链表:从任一结点出发可以快速找到其前驱结点和后继结点,。从任一结点出发可以访问其他结点。
    技术图片
    ----------------------------------------------------------------------------------------------------
    技术图片
  • 双链表的插入及删除。前驱以及后继的关系均要改变
    技术图片
    技术图片
  • 带头结点的循环单链表和循环双链表
    技术图片

    1.2对线性表的认识及学习体会

    本章学了线性表及线性表的各种运算,例如插入、删除等。线性表主要有顺序表和链表两种,而链表又有单、双、循环链表。
    根据上述总结可以看出各自的优缺点:顺序表可以很快的找到相应的节点,但比较浪费空间,在处理大量元素时效率就显得低下。
    链表对相邻两个数据之间用结点中的指针来指示,不要求逻辑上相邻的两个元素存储的物理空间相邻,对碎片空间的利用率高。
    对于线性表的学习,我感觉我还是比较吃力的。上学期的关于链表的知识在现在又重新被激活,又增加了许多知识。
    我总是会在链表的操作上栽跟头,还是很不熟练,真的需要代码量来填补。做pta时不能够举一反三,还是对链表理解不够深,需要多多练习。

    2.PTA实验作业

    2.1jmu-ds-有序链表合并

    2.1.1代码截图

    技术图片
    技术图片

    2.1.2本题PTA提交列表说明

    技术图片
  • 刚开始没有注意重复的这种情况,改了几次后添了对重复这种情况的操作后就正确了。

    2.2jmu-ds-链表分割

    2.2.1代码截图

    技术图片
    技术图片

    2.2.2本题PTA提交列表说明

    技术图片
  • 刚开始是在一次循环中操作两次,即没有if判断条件,第一次操作L1,第二次操作L2,后来发现这样十分容易出错。问了同学之后,定义flag变量,交替操作就通过了。

    2.3 jmu-ds-链表区间删除

    2.3.1代码截图

    技术图片
    技术图片

2.3.2本题PTA提交列表说明

技术图片
刚开始看到了需要排序,但是我不知道怎么插入排序,于是我先输入数据,在排序,期间排序错误,部分正确,后来发现删除函数也有些错误,改过来之后就对了。后来发现其实改一下就是输入插入排序了,如下
技术图片
技术图片

3.阅读代码

3.1题目及解题代码

技术图片
技术图片
技术图片

3.1.1该题的设计思路

技术图片
该题是一个循环链表,时间复杂度为O(n),空间复杂度为O(1)

3.1.2该题的伪代码

建立一个循环链表
while (p->next != p) 遍历循环链表
{
    找到每三个人的第三个人        
        杀死该人即删掉该节点
    输出被杀掉的人
    p->next = p->next->next;       //将该节点从链表上删除。
    p = p->next;节点移动
}

3.1.3运行结果

技术图片

3.1.4题目解题优势及难点

  • 优势:改代码用了循环链表,整体代码不是特别难懂,所以并无突出的特点,但该代码也拓宽了思维
  • 难点:将问题转化为循环链表,我们学习主要学习单链表,而循环链表以及双链表只是浅显学了,很少用他们,所以在面对这种题是肯不知道如何去做。题目简单,但其实可以改为n个人排成圈,第m个人自杀。

    3.2题目及解题代码

    技术图片
    技术图片

    3.2.1该题的设计思路

    技术图片
    时间复杂度为O(n)空间复杂度为O(1)

    3.2.2该题的伪代码

while(指针不为空)
{
    oddList->next = evenList->next  下标为单数的节点相互连接
    evenList->next = oddList->next->next  下标为双数的节点相互连接
    oddList = oddList->next;
    evenList = evenList->next;指针指向下一个节点
}
单标链后接上双标链

3.2.3运行结果

技术图片

3.2.4题目解题优势及难点

  • 优点:直接用两个指针操作,一个指向单标的节点,一个指向双标的节点,利用相互关系,操作十分简单。用一个指针存放第二个节点,便于之后两个链的连接
  • 难点:该代码使用的指针是不带头结点的链表,我们学习的一般都是带头结点的链表,所以读起来会有些别扭,实际上我的运行结果是我把他的链表变为带头结点的链表的结果。

以上是关于DS01——线性表的主要内容,如果未能解决你的问题,请参考以下文章

DS01——线性表

DS01-线性表

第02次作业-线性表

问题 A: DS哈希查找—线性探测再散列

algo&ds2.线性表

数据结构 链表