总结

线性表作为课本上第一个介绍的数据结构,比较基础,一共讲了顺序表实现(数组)、单链表实现、双链表实现、循环单双链表实现、静态链表实现五种方法,具体选择时要根据题目叙述来选择合适的实现方法,一般涉及前后移动就考虑双链表,在尾部频繁操作就考虑循环链表,具体情况具体分析。对于一些选择题,可以采用画图的方法画出结构的逻辑图示,更方便做题。对于大题,一定要读清楚题目,看看有没有空间复杂度的要求,如果只要求了时间复杂度,那就是说可以拿空间换时间,大胆使用辅助数组就行,但是如果要求空间复杂度为O(1)那就只能乖乖的原地操作,用指针的指向来进行操作。
顺序表实现:https://blog.csdn.net/weixin_43849505/article/details/106437024
单链表实现:https://blog.csdn.net/weixin_43849505/article/details/106483580
双链表实现:https://blog.csdn.net/weixin_43849505/article/details/106500241
循环链表实现:https://blog.csdn.net/weixin_43849505/article/details/106535293
静态链表实现:https://blog.csdn.net/weixin_43849505/article/details/106535612

代码模板

链表反转

//p为第一个数据节点
//将链表后半段逆置pqr->rqp
q=p->next;
p->next=NULL;
while (q!=NULL)
{ r=q->next; q->next=p->next; p->next=q; q=r;
}

寻找中间节点

//寻找中间结点,p走一步,q走两步
while (q->next!=NULL)
{ p=p->next;q=q->next; if(q->next!=NULL) q=q->next;
}

求表长

int getlen()
{int len=0;struct LNode *p=head->next;while(p){len++;p=p-next;}return len;
}

逆序输出

void R_Print() { if(L->next!=NULL) R_Print(L->next);if(L!=NULL) printf(L->data);
}

典型题

从王道数据结构上拔下来几道题目

这个题目考的就是malloc函数寻找连续空间的特点,需要开辟的长度是m+n,所以malloc函数会在内存上找长度为m+n长度的连续空间。malloc一定是从头去分配,而不是再原来的部分再向后续接。

统考题就是有东西,这里先将数组分为两部分,用a代表要移动到后面去的下标0到p-1的数据,b代表剩下部分,如果直接循环移动,必然会有大量的时间浪费在移动数据上,答案则是用了起始状态的数据特点,先把a逆转,再逆转b,最后逆转整个数组,虽然时间复杂度也不小,但是相比较之下的确是更优的算法。

要追求时间复杂度,所以就不能使用一些很笨的办法,这里是利用了中位数的特点,比较两个序列的中位数,如果相等则这个数就是要求的中位数,如果不等,那么将较小的中位数所在的数列的左半部分删除,将较大的中位数所在的数列的右半部分删除,继续重复算法直到有一个序列只含一个元素为止,较小者即为要求的中位数。

这里可以稍微证明一下,假设中位数存在在较小中位数所在数列左半部分,假设两个数列长度都是n+1,那么根据中位数的特点,第一个数列中至少有n/2+1个数比它大,而且在第二个数列中也至少有n/2+1个数比它大,所以合并之后至少有n+2个数比它大,显然不符合中位数的定义,所以可以确定中位数不在这部分,可以放心删除。如此不断缩小范围,直到得到最终结果。


题目巧就巧在是循环单链表,即使表里面为空,也会在头结点上反复移动,所以长度是0或者1,是0对应着式子左边一直在头结点上移动,是1表示式子中第一个next是跳转到了下一个节点第二个next是又跳回了头结点。


由链表的性质可以知道,一旦有公共节点,那么公共节点后面的节点就都是一样的,如果画出这两个链表的逻辑关系,应该是一个类似于Y的形状,其中两个分叉的长度可能会不一样,但是一旦有公共节点出现,那么后续的节点就都一样且数目相等。发现了这个规律就好办了,分别遍历一边两个链表并记录下表长,如果最后一个节点数据相等则说明存在公共节点,之后选取两个链表里面长的那个先开始遍历,等长之后再同步遍历,如果同步遍历过程中出现了相等节点,那么这个节点就是公共节点。


题目要查找倒数第K个节点,那么关键就是在链表中怎么找出K,由于链表不能倒着访问,所以就要从链表长度的规律下手,假设链表长度是K+M,设两个指针都指向头结点,其中一个指针先开始遍历,当遍历了前K个节点时另一个指针也开始同步移动,当第一个指针到表尾时,第二个指针指向的位置就是倒数第K个元素。这里设计很巧妙,先访问K个元素,那么剩下的就是M个元素,第二个指针再移动M个元素,那么最终位置就是倒数第K个元素了。


题目本质上是要重排线性表,但是里面存在一个逆序的子序列,即n-n/2这部分,因为是单链表,所以不能逆序访问,所以需要先将原序列的n/2到n的部分进行逆序,变成1-2-X-n-n-1-X-n/2的序列,这时就可以用两个指针指向1和n,分别访问并依次改变指向关系。

数据结构 2-0 线性表总结相关推荐

  1. 【数据结构】除去线性表中的重复数字

    题目:写一个算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同. 刚看到这个题目给我第一个思路是冒泡排序,可以利用冒泡排序的两层循环找出相同的结点,然后free掉.第一层循环是控制循环的 ...

  2. Java版数据结构与算法——线性表

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  3. 数据结构复习题(线性表)

    数据结构复习题(线性表) 线性表 选择题 填空题 判断题 解答题 顺序表的插入和删除 单链表的插入与删除,创建 线性表 选择题 用单链表方式存储的线性表,存储每个节点需要两个域,一个是数据域,另一个是 ...

  4. 算法与数据结构(一):线性表(C++实现)

    文章目录 算法与数据结构(一):线性表(C++实现) 头文件定义线性表类的成员变量和成员函数 头文件类成员函数的实现 主函数 参考:算法分析与设计(C++描述) 石志国.刘冀伟.姚亦飞编著 算法与数据 ...

  5. 大话西游之王道考研数据结构第一讲---线性表的顺序表示

    大话西游之王道考研数据结构第一讲---线性表的顺序表示 写在前面的话 王道考研数据结构是一本非常好的书,本系列所有的内容是按照其书进行讲述的,所以您可以以那本书作为主要内容,这个做参考. 大学时候,在 ...

  6. C语言数据结构-第二章线性表-电大

    第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...

  7. 【数据结构】之线性表(顺序存储结构)

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  8. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  9. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

  10. 数据结构与算法 | 线性表 —— 链表

    原文链接:wangwei.one/posts/java-- 链表 定义 逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构 ...

最新文章

  1. 小白也能看懂的教程:微信小程序在线支付功能开通详细流程(图文介绍)
  2. php 模块指令,php artisan module常用命令
  3. 渐统江湖的项目原型生成工具 -- Maven Archetype
  4. 【PAT乙级】1087 有多少不同的值 (20 分)
  5. NLP研究方向的「情感分析领域」的简单调研
  6. SpringMvc 面试题
  7. 工厂三兄弟之工厂方法模式
  8. 关于JavaScript的浅拷贝和深拷贝
  9. irq4中断子程序c语言写法,AVR汇编程序参考
  10. .NET Core 从 Github到 Nuget 持续集成、部署
  11. JS 操作cookie
  12. caffe中的 AlexNet,LeNet,CaffeNet
  13. html酒店管理模板,酒店管理系统流程图模板分享及绘制技巧
  14. 变速恒频风电机组的优缺点_恒速和变速恒频风电系统简介
  15. Springboot引入hibernate配置自动建表并进行增删改查
  16. 安兔兔苹果html5排行榜,iPhone8Plus最强?9月安兔兔手机性能排行榜出炉
  17. 发布曾经出售过的PIC开发工具制作资料包括:JMD烧写器,串口ICD2,USB口ICD2.5
  18. Django个人博客搭建4-配置使用 Bootstrap 4 改写模板文件
  19. 数据库笔记--常见sql操作
  20. WPS表格 JSA-单格内,按文字颜色处理文字

热门文章

  1. 课下作业——对正在使用的搜索类软件/输入法进行评价
  2. tftp的安装、设置以及put、get传输实验
  3. 字符串匹配算法总结(转)
  4. Oracle Solaris 本地安全漏洞2
  5. 关于.net中值类型的方法调用
  6. 列出IIS上的虚拟目录和网站信息。
  7. mysql hql查询语句_常用HQL语句
  8. Spring Boot Executable jar/war 原理
  9. JAVA 面向对象的一些基础理解
  10. AC自动机 学习链接