自己实现集合框架(十):双链表的实现
2017-06-02 00:00
141 查看
一. 双链表的数据结构
1. 什么是双链表?
双链表是针对于单链表而言的,我们知道,单链表的每个节点有两个域,一个是数据域,存储元素结点的数据,一个是next链域,存储该结点后继元素的地址。双链表的每个结点有三个域,一个数据域,存储元素结点的数据,两个链域,分别指向它的前驱结点和后继结点,单个结点结构示意图如下所示:
双链表的结构如下图所示:
2. 为什么要使用双链表?
在单链表中,每个结点只有一个指向其后继结点的链。如果要查找某个结点的前驱结点,需要从链表的头结点开始沿着链表方向逐个遍历,操作效率很低,所以这个时候我们需要使用双链表。二.双链表的实现
双链表比单链表在结点的数据结构上增加一个指向前驱结点的链,使得某个结点能够直接获取它的前驱结点和后继结点,双链表能够沿着前后两个方向进行遍历,这给链表的操作带来了很大的便利。双链表判断是否为空,遍历等操作和单链表比较类似,下面不再重复讨论,可以参考前面的文章自己实现集合框架(四):单链表的实现,下面主要讨论双链表的插入和删除操作。1.定义双链表节点类
双链表节点类DoubleLinkNode的定义如下所示:
代码解释:
成员变量data保存当前结点的数据元素,
prev指向前驱结点,
next指向后继结点。
2.定义双链表类
双链表类DoubleLinkedList的定义如下,
head成员变量表示双链表的头结点。
代码解释:
双链表DoubleLinkedList类实现接口
LList,所以必须实现该接口的相关方法,具体实现在下面讲解。
3. 双链表的插入
对双链表进行插入操作非常方便,只需要改变节点间的链接关系即可,不需要移动元素。代码如下:代码解释:
设
p指向双链表的某一个结点,在
p结点之前插入
q结点的示意图如下所示:
在
p结点之前插入
q结点的语句如下所示:
DoubleLinkNode q = new DoubleLinkNode(element); q.prev = p.prev; q.next = p; p.prev.next = q; p.prev = q;
4. 双链表的删除
在单链表中删除节点只需要改变某些链接,不需要移动节点数据元素,代码如下所示:代码解释:
设p指向双链表中的某个结点,删除
p指向的结点示意图如下所示:
删除
p指向的结点的执行语句如下所示:
p.prev.next = p.next; if (p.next != null) { p.next.prev = p.prev; }
5. 清空双链表
代码如下所示:6. 重写toString()方法
代码如下所示:三.测试
测试代码如下所示:运行效果如下图所示:
四.源代码示例
相关文章推荐
- 自己实现集合框架(七):带头结点单链表的实现
- 自己实现集合框架(五):利用单链表解决约瑟夫环问题
- 自己实现集合框架(六):实现单链表逆转
- 自己实现集合框架(十二):顺序栈的实现
- 自己动手实现集合框架类(四)之LinkedHashMap
- 自己实现集合框架(九):循环单链表的实现
- 自己动手实现集合框架类(一)之ArrayList
- java8集合框架LinkedList类实现自己简单的理解
- 自己实现集合框架(十一):栈接口定义
- [JAVA]集合框架之自己实现一个具有基本增查删改功能的ArrayList
- 自己动手实现集合框架类(三)之HashMap
- 自己实现集合框架(十三):链式栈的实现
- 自己实现集合框架(八):可排序单链表的实现
- 自己实现的集合框架
- 自己实现的一个寻径算法的框架,具体算法采用动态库模式,可以非常方便灵活地尝试多种寻径算法
- SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)
- 手动实现枚举器、泛型集合、单链表
- 实现自己的拦截器框架
- 实现自己的拦截器框架
- java集合框架学习—HashSet的实现原理