本教程的内容基本来自于《Java数据结构与算法》

单向链表的缺点在于每个节点只能知道自己与下一个节点,无法寻找到上一个节点。而双向链表可以解决这个问题,通过在节点内部添加一个previous指针,指向它的前一节点。

双向链表示意图

图中所示为双向链表,与单向链表相比,只不过是多引入了一个指向前一节点的previous指针而已。

优点:支持向前遍历,也支持向后遍历;
缺点:在对链表进行增删的时候需要对2个以上指针进行操作。

节点类的定义如下

class Link
{public long dData;         //节点存储的数据public Link next;          //指向下一节点的指针public Link previous;      //指向前一节点的指针public Link(long d){this.dData = d;}public void displayLink(){System.out.print(dData+" ");}
}

双向链表类的定义

class DoublyLinkList
{private Link first;public DoublyLinkList(){ this.first = null; }public boolean isEmpty(){ return (this.first==null); }......
}

主要方法有

public void insertFirst(long dd);                //从头部插入元素
public Link deleteFirst();                          //删除头节点
public boolean insertAfter(long key, long dd);      //在指定节点key后插入节点
public Link deleteKey(long key);                    //删除指定节点
public void displayForward();                       //向前遍历

1.从头部插入元素

从图中看到总共分三步

1.first.previous -----> newLink
2.newLink.next ----> 旧first
3.first ----> newLink

代码如下

public void insertFirst(long dd)
{Link newLink = new Link(dd);                //新建节点if(!isEmpty())this.first.previous = newLink;          //第一步newLink.next = this.first;                  //第二步this.first = newLink;                        //第三步
}

2.删除头节点


删除头结点比较简单,只需两步即可

1.first.next.previous -----> null
2.first -----> first.next

public Link deleteFirst()
{Link temp = this.first;               //返回删除的节点this.first.next.previous = null;      //第一步this.first = this.first.next;         //第二步return temp;
}

3.指定位置插入节点

current表示找到的指定位置,插入节点主要分四步

1.current.next.previous -----> newLink
2.newLink.next -----> current.next
3.newLink.previous -----> current
4.current.next -----> newLink

代码如下

public boolean insertAfter(long key, long dd)
{//遍历链表查找节点keyLink current = first;while(current.dData!=key){current = current.next;if(current==null)return false;                  //没找到返回false}//在current后插入新节点Link newLink = new Link(dd);if(current.next!=null)current.next.previous = newLink;   //第一步newLink.next = current.next;           //第二步newLink.previous = current;            //第三步current.next = newLink;                //第四步return true;
}

4.删除指定节点

current表示找到的指定位置,插入节点主要分两步

1.current.previous.next -----> current.next
2.current.next.previous -----> current.previous

代码如下

public Link deleteKey(long key)
{//遍历链表查找节点Link current = this.first;while(current.dData!=key){current = current.next;if(current==null)return null;}//如果是头节点,则按照删除头节点的方式删除节点if(current==this.first)this.first = this.first.next;//否则else{current.previous.next = current.next;            //第一步if(current.next!=null)current.next.previous = current.previous;    //第二步}return current;
}

5.向前遍历

这部分和单链表一样

public void displayForward()
{Link current = this.first;System.out.print("List (first-->last): ");while(current != null){current.displayLink();current = current.next;}System.out.println("");
}

6.如果是双端口的链表,还支持后向遍历,这里没有展开。

github完整代码

https://github.com/gamersover/data_structure_java/blob/master/LinkList/DoublyLinkListApp.java

java数据结构:双向链表结构与实现相关推荐

  1. Java数据结构——双向链表、约瑟夫问题

    使用带head头的双向链表实现 –排行榜 管理单向链表的缺点分析: 1) 单向链表, 查找的方向只能是一个方向 ,而双向链 表可以向前或者向后查找. 2) 单向链表不能自我删除,需要靠辅助节点 ,而双 ...

  2. Java数据结构 双向链表

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一.分析思路 二.使用步骤 1.定义节点类 2.添加数据 3.删除数据 总结 前言 如不了解单向链表可以先查看 ...

  3. Java数据结构-双向链表的实现

  4. 【Java 数据结构】双向链表

    篮球哥温馨提示:编程的同时不要忘记锻炼哦! 圆圆的脑袋,大大耳朵,天天敲代码,找找找bug 目录 1.什么是双向链表 2.实现一个双向链表 2.1 实现前的约定 2.2 addFirst 方法 2.3 ...

  5. Java——数据结构之双向链表

    文章目录 Java--数据结构之双向链表 1.单链表的实现 (1)定义一个节点类型 (2)头插法 (3)尾插法 (4)根据下标插入节点 (5)查找关键字 (6)删除第一次出现的关键字 (7)删除所有出 ...

  6. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  7. 数据结构学习之双向链表结构

    注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流.转载请注明来自: http://blog.csdn.net/ab198604 在前面总结的单向链表结构的基础上,现在开始着手实践实践双向 ...

  8. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  9. java数据结构 第4章-链表(双向链表)

    文章目录 4.4 双向链表应用实例 4.4.1双向链表的操作分析和实现 1.管理单向链表的缺点分析: 2.分析 双向链表的遍历,添加,修改,删除的操作思路 3.双向链表的代码实现 4.代码运行结果 4 ...

最新文章

  1. Weiss的数据结构与算法分析(C++版)源码编译说明
  2. 利用OnAnimatorove函数控制人物的移动
  3. tomcat WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
  4. 未转变者rust服务器推荐,如果steam只留一个游戏,你会选择吃鸡还是CSGO
  5. NTU 课程笔记: 网络流
  6. 【数据库复习】第二章关系数据库
  7. 求斐波那契数列第n位的几种实现方式及性能对比
  8. ArcEngine中实现对符号的预览图输出
  9. mysql中php编程实例_PHP连接MYSQL数据库实例代码
  10. leetcode python3 简单题190. Reverse Bits
  11. 避免数据二次提交的处理方式
  12. $ is not defined与SpringMVC访问静态资源
  13. php部分---注册审核
  14. python发明小故事简写_科学发明小故事10字以上
  15. hp 服务器 无线网卡,换个网卡再战!—记惠普4431s笔记本更换无线网卡体验
  16. oracle pdb与cdb区别,CDB与PDB的系统关系
  17. 【Unity3D-Mirror多人坦克大战】子弹及其开火位置的生成、子弹开火逻辑(四)
  18. bzoj4008亚瑟王
  19. [BJDCTF 2nd]燕言燕语-y1ng解析
  20. 汽轮机胀差及轴向位移(转载的)

热门文章

  1. 公积金贷款与商业贷款的区别
  2. 【电机应用控制】——直流有刷电机驱动板/编码器介绍PID算法实操代码思路
  3. ROS语音控制——小乌龟按设定图形路线运动
  4. 启发!这几个日流量上百万的台湾农场采集站值得一看
  5. activiti+5.21+mysql_ydl-workflow基于SAAS服务,完美整合springboot + activiti5 + MyBatis
  6. ES——使用Postman连接Elasticsearch
  7. openlayers6 第一篇绘制点线面
  8. Android studio 多渠道版本打包方法 flavor dimension
  9. 用Grafana5.1 给zabbix 3.4.9 披上白富美的外衣
  10. html textarea 插件,在TextArea中呈现HTML