线性表16:双向链表 - 数据结构和算法21
2012-12-20 05:58
519 查看
线性表16 : 双向链表
让编程改变世界Change the world by program
这货我们地球人把他称为火车,有了它,全世界每年春季最大规模的物种迁移才会发生在中国!
双向链表
大家都知道,任何事物出现的初期都显得有些不完善。例如我们的火车刚发明的时候是只有一个“头”的,所以如果它走的线路是如下:A->B->C->D->E->F->G->H->I->J->K->L->A
假设这会儿火车正停在K处呢,要他送一批货到J处,那么它将走的路线是:
K->L->A->B->C->D->E->F->G->H->I->J
嗯,所以后来我们的火车就都有两个头了。看完这个例子,大家就明白双向链表的必要性了吧。
双向链表结点结构
[codesyntax lang="c"]typedef struct DualNode { ElemType data; struct DualNode *prior; //前驱结点 struct DualNode *next; //后继结点 } DualNode, *DuLinkList;
[/codesyntax]
[caption id="attachment_2002" align="alignnone" width="500"]
双向链表的结构[/caption]
既然单链表可以有循环链表,那么双向链表当然也可以有。
[caption id="attachment_2003" align="alignnone" width="500"]
双向链表循环[/caption]
在这里小甲鱼问大家一个问题:由于这是双向链表,那么对于链表中的某一个结点p,它的后继结点的前驱结点是什么?
双向链表的插入操作
插入操作其实并不复杂,不过顺序很重要,千万不能写反了。[caption id="attachment_2004" align="alignnone" width="500"]
双向链表的插入操作[/caption]
代码实现:
[codesyntax lang="c"]s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s;
[/codesyntax]
关键在于交换的过程中不要出现矛盾,例如第四步先被执行了,那么p->prior就会提前变成s,使得插入的工作出错。
严重性打个比方就是打电话给老婆的时候不小心叫成小三的名字!
双向链表的删除操作
如果刚才的插入操作理解了,那么再来理解接下来的删除操作就容易多了。[caption id="attachment_2005" align="alignnone" width="500"]
双向链表的删除操作[/caption]
代码实现:
[codesyntax lang="c"]p->prior->next = p->next; p->next->prior = p->prior; free(p);
[/codesyntax]
最后总结一下,双向链表相对于单链表来说,是要更复杂一点,每个结点多了一个prior指针,对于插入和删除操作的顺序大家要格外小心。
不过,双向链表可以有效提高算法的时间性能,说白了就是用空间来换取时间。
本章节结束语
主题:力争做一只逆流而上的小甲鱼![buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/BdsUAwoZVQCHkxNR645']视频下载[/Downlink]
[Downlink href='http://urlxf.qq.com/?ZNvUNvE']备胎下载[/Downlink]
相关文章推荐
- 线性表16:双向链表 – 数据结构和算法21
- 线性表16:双向链表 - 数据结构和算法21
- 数据结构与算法——线性表链式存储(双向循环链表)
- 数据结构 算法面试100题 之 二叉树转换成双向链表
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- Java数据结构-线性表之双向链表
- 【数据结构与算法003】基本数据结构——线性表(链表)
- 线性表12|循环链表 - 数据结构和算法17
- 《Delphi 算法与数据结构》学习与感悟[10]: 双向链表
- 线性表12|循环链表 - 数据结构和算法17
- Java数据结构-线性表之双向链表
- 对链表的操作(数据结构线性表算法设计练习)
- 算法与数据结构面试题(1)-把二元查找树转变成排序的双向链表
- 数据结构----线性表----双向链表
- 左程云_算法与数据结构 — 链表问题 — 04反转单向和双向链表
- 数据结构与算法之链表4---双向链表
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 【数据结构】-线性表-双向循环链表-1328:链表的基本操作【好题】
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 数据结构编程笔记六:第二章 线性表 双向循环链表的实现