《大话数据结构》--学习笔记12 ***重点***
来源:互联网 发布:淘宝网天天特价女鞋 编辑:程序博客网 时间:2024/05/29 08:50
3.14 双向链表
生活中的双向链表,如图:
单链表总是从头找结点,难道就不可以正反遍历都可以吗?当然可以,只不过需要加点东西而已。
我们在单链表中,有了next指针,就使得我们要查找一下结点的时间复杂度O(n)了,因为我们每次都要从头开始遍历查找。
为了克服单向性这一缺点,出现了-----“双向链表”,就是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。
/*线性表的双向表存储结构*/
typedef struct DulNode{ ElemType data; struct DuLNode *prior; /*直接前驱指针*/ struct DuLNode *next; /*直接后继指针*/} DulNode , *DuLinkList;
既然单链表也可以有循环链表,那么双向链表当然也可以是循环链表。
双向链表的循环带头结点的空链表如图:
非空的循环的带头结点的双向链表如图:
由于这是双向链表,那么对于链表中的某个结点p,它的后继的前驱是谁?当然还是它自己。它的前驱的后继也是他自己。即:
p->next->prior = p = p->prior->next
这就如同上海的下一站是苏州,那么上海的下一站的前一站是哪里?上海呀!笨....
双向链表是单链表中扩展出来的结构,所以它的很多操作是和单链表相同的,比如长度的ListLength,查找元素的GetElem,获得元素位置的LocateElem等这些操作都只要涉及一个方向的指针即可,另一指针多了也不能提供什么帮助。
双向链表既然是比单链表多了,可以反向遍历查找等数据结构,那么也就要付出一些小的代价:再插入和删除时,需要更改两个指针变量。
双向链表的插入:
假设存储元素e的结点为s,要实现将结点s插入到结点p和p->next之间需要下面几步,如图:
s->prior =p; /*把p赋值给s的前驱,如图(1)*/ s->next =p->next; /*把p->next赋值给s的后继,如图(2)*/p->next->prior =s; /*把s赋值给p->next 的前驱,如图(3)*/p->next =s; /*把s赋值给p的后继,如图(4)*/关键在于它们的顺序,由于第2步和第3步都用到了P->next。如果第4步先执行,则会使得p->next提前变成了s,使得插入的工作完成不了。所以我们不妨先把上面这张图在理解的基础上记忆,顺序是先搞定s的前驱和后继,再搞定后结点的前驱,最后解决前结点的后继。
如果插入操作理解了,那么删除操作,就比较简单了。
若要删除结点p,只需要下面两步骤,如图:
p->prior->next = p->next; /*把p->next赋值给p->prior的后继,如图:(1)*/ p->next->prior =p->prior ; /*把p->prior赋值给p->next的前驱,如图(2)*/free(p);
总结一下,双向链表相对于单向链表更复杂些,毕竟多了一个prior前驱指针,对于插入和删除时,需格外小心。另外它由于每个节点都需要记录两份指针,所以空间上是要占用更多一些。不过,由于它良好的对称性,使得对某个结点的前后结点的操作,带来方便,可以有效的提高算法的时间性能。说白了--就是空间换时间。
本章总结:
线性表的两种结构如图:
- 《大话数据结构》--学习笔记12 ***重点***
- 《大话数据结构》--学习笔记8 ***重点***
- 《大话数据结构》--学习笔记9 ***重点***
- 《大话数据结构》--学习笔记10 ***重点***
- 《大话数据结构》--学习笔记11 ***重点***
- 大话数据结构学习笔记
- 《大话数据结构》第一章学习笔记
- 《大话数据结构》--学习笔记1
- 《大话数据结构》--学习笔记2
- 《大话数据结构》--学习笔记3
- 《大话数据结构》--学习笔记4
- 《大话数据结构》--学习笔记5
- 《大话数据结构》--学习笔记6
- 《大话数据结构》--学习笔记7
- 大话数据结构学习笔记1
- 大话数据结构学习笔记2
- 《大话数据结构》学习笔记(1)
- 《大话数据结构》第二章学习笔记
- ORACLE基本查询
- SPQuery在引用field的时候要用internal name
- poj题目分类
- C#属性和字段的认识
- 测试驱动开发的经验教训
- 《大话数据结构》--学习笔记12 ***重点***
- Cscope在emacs中的配置与使用
- Linux make命令介绍
- [Linux]: ssh大致介绍
- 【转载】边缘检测算法的四个步骤
- ubuntu 下安装 odbc 驱动
- Cookie与Session
- Best Paper Awards in Computer Science
- [java] Eclipse的平台搭建