2 数组&链表

[亡魂溺海] 提交于 2020-07-26 23:26:01

数组&链表

 

① 数组  VS  链表

1 数组

  • 所申请的内存空间,必须是线性连续,且申请的空间大小必须提前确定
  • 插入删除操作代价比较大,需要该位置后面的数据都向后移动,留出一个空位进行插入,或者都向前移动,把该空位的数据进行覆盖(也就是删除);
  • 查询代价较小,数组是连续存储的,知道该数组名称,可根据下标直接查询;
  • 不利于扩展,数组空间是提前申请的,当存储空间不够时,需要重新申请空间。

2 链表

  • 申请内存中存储空间,不要求连续,只需要保存下一个存储空间的内存地址即可。
  • 插入删除操作比较容易,只需要改变指针的指向即可;
  • 查询代价较大,不具备随机访问能力,需要从头到尾遍历查找;
  • 扩展性较好,不用提前指定大小,插入删除比较随意。

3 时间复杂度

使用场景:对于频繁查询的场景,选用数组;对于频繁插入删除的场景,选用链表;频繁查询也频繁增删呢?选用数组链表。

4 空间利用

内存空间利用率:每一个数组单元是 100% 存储数据,每一个链表单元是存储数据 + 存储指针,数组对于内存的利用上大于链表(当然了,还需要看是否提前知道要存储数据个数)。

 

② 链表

链表分为 4 种情况:单链表,单循环链表,双链表,双循环链表,一定要反复琢磨,理解清楚我下面画的模型,这些模型是本文核心所在;

各自模型如下:

 

③ 链表上的操作

1 单链表

单链表分为 2 种情况:带头结点链表 + 不带头结点链表。

链表上常见操作:创建链表、插入链表,删除链表,查找数据,修改数据,销毁链表.......

4种链表的操作基本大同小异,最难的是双向循环链表的操作,此处就只介绍这种较困难的模型。

 

2 双向循环链表

模型如下:

思路:链表结点类型,然后就是双向循环链表的控制头,在进行具体的各种函数的编写。

 

④ 分析

链表操作:插入、删除、销毁、查找之类的关键操作,需要先在纸上画出模型,充分理解指针指向的改变,即可解决(参照我上面给出的模型 + 部分代码)。

链表销毁:从头往后一个一个删除链表结点,只要对下一个节点的地址空间进行保存,这样循环下去就一一释放了;

链表排序:指针的指向不变,即整个链表的结构不变,不会有增删操作,只是交换存储空间的数据即可。

玩数组就是玩下标,玩链表就是玩指针!

 

 

内容摘自微信公众号《编程剑谱》

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!