线性表6 – 数据结构和算法11
2015-11-16 16:56
267 查看
线性表6
让编程改变世界Change the world by program
单链表的插入
我们先来看下单链表的插入。假设存储元素e的结点为s,要实现结点p、p->next和s之间逻辑关系的变化,大家参考下图思考一下:单链表的插入
我们思考后发觉根本用不着惊动其他结点,只需要让s->next和p->next的指针做一点改变。
s->next = p->next;
p->next = s;
我们通过图片来解读一下这两句代码。
单链表的插入
那么我们考虑一下大部分初学者最容易搞坏脑子的问题:这两句代码的顺序可不可以交换过来?
先 p->next = s;
再 s->next = p->next;
大家发现没有?如果先执行p->next的话会先被覆盖为s的地址,那么s->next = p->next其实就等于s->next = s了。
所以这两句是无论如何不能弄反的,这点初学者一定要注意咯~
单链表第i个数据插入结点的算法思路:
声明一结点p指向链表头结点,初始化j从1开始;
当j<1时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
若到链表末尾p为空,则说明第i个元素不存在;
否则查找成功,在系统中生成一个空结点s;
将数据元素e赋值给s->data;
单链表的插入刚才两个标准语句;
返回成功。
单链表的删除
现在我们再来看单链表的删除操作。单链表的删除
假设元素a2的结点为q,要实现结点q删除单链表的操作,其实就是将它的前继结点的指针绕过指向后继结点即可。
那我们所要做的,实际上就是一步:
可以这样:p->next = p->next->next;
也可以是:q=p->next; p->next=q->next;
那么我给大家提供算法的思路,由大家来写一下代码吧~
单链表第i个数据删除结点的算法思路:
声明结点p指向链表第一个结点,初始化j=1;
当j<1时,就遍历链表,让P的指针向后移动,不断指向下一个结点,j累加1;
若到链表末尾p为空,则说明第i个元素不存在;
否则查找成功,将欲删除结点p->next赋值给q;
单链表的删除标准语句p->next = q->next;
将q结点中的数据赋值给e,作为返回;
释放q结点。
效率PK
我们最后的环节是效率PK,我们发现无论是单链表插入还是删除算法,它们其实都是由两个部分组成:第一部分就是遍历查找第i个元素,第二部分就是实现插入和删除元素。从整个算法来说,我们很容易可以推出它们的时间复杂度都是O(n)。
再详细点分析:如果在我们不知道第i个元素的指针位置,单链表数据结构在插入和删除操作上,与线性表的顺序存储结构是没有太大优势的。
但如果,我们希望从第i个位置开始,插入连续10个元素,对于顺序存储结构意味着,每一次插入都需要移动n-i个位置,所以每次都是O(n)。
而单链表,我们只需要在第一次时,找到第i个位置的指针,此时为O(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是O(1)。
显然,对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显啦~
转自:http://blog.fishc.com/1821.html
相关文章推荐
- 线性表5 – 数据结构和算法10
- 线性表4 – 数据结构和算法09
- 项目1--图基本算法库
- 第12周 项目1—数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
- 数据结构实践—— 二叉树算法验证(中序线索化二叉树的算法验证)
- 第十二周 图 项目2--操作用邻接表存储的图
- 线性表3 – 数据结构和算法08
- 线性表2 – 数据结构和算法07
- 线性表1 – 数据结构和算法06
- 数据结构实践——二叉树算法验证(二叉树构造算法的验证)
- 时间复杂度和空间复杂度3 – 数据结构和算法05
- 2015-11-16 【项目1 - 图基本算法库】
- 数据结构—树——20150604
- 时间复杂度和空间复杂度2 – 数据结构和算法04
- 【数据结构】K-means聚类
- 时间复杂度和空间复杂度1 – 数据结构和算法03
- 谈谈算法 – 数据结构和算法02
- 2015-11-16 【项目2 - 用二叉树求解代数表达式】
- 数据结构实践——二叉树算法验证(层次遍历算法的验证)
- 绪论 – 数据结构和算法01