双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点后继结点

下图是双向链表的逻辑结构图,和单链表不同的是,双向链表中每个节点包含两个节点的指针引用,和一个数据域,这两个节点分别指向前一个节点和后一个节点;

双向链表的这种结构比起单链表,其改进之处正在于此,通过对前后节点的引用可以使得在整个链表中,通过给定的值,可以从前或者向后遍历,大大提升了遍历查询的效率,一定程度上解决了单链表的性能问题,但与此同时,链表的存储开销也增大了,我们熟悉的linkedList,其底层就是这个原理实现的,

废话不多说,相信通过上面的解释大家已经很明白了,下面直接上代码,可以结合代码和图结构理解双向链表,

public class DoubleLinkTest<T> {/*** 内部构造节点类* * @param <T>*/private class Node<T> {private T data;private Node next; // 指向下一个节点的引用private Node prev; // 指向前一个节点的引用public Node(T data) {this.data = data;}}private Node<T> head; // 模拟头结点private Node<T> last; // 模拟尾部节点private Node<T> other; // 暂定一个临时节点,用作指针节点private int length;public void DoubleLinkTest() {head = new Node<T>(null);last = head;length = 0;}public void DoubleLinkTest(T data) {head = new Node<T>(data);last = head;length = 0;}/*** 链表是否为空* * @return*/public boolean isEmpty() {return length == 0;}/*** 普通添加,往链表尾部添加* * @param data*/public void add(T data) {if (isEmpty()) { // 链表为空,新创建一个链表head = new Node<T>(data);last = head;length++;} else {other = new Node<T>(data);other.prev = last;last.next = other; // 将新的节点与原来的尾部节点进行结构上的关联last = other; // other将成为最后一个节点length++;}}/*** 在指定的数据后面添加数据* * @param data* @param insertData*/public void addAfter(T data, T insertData) {other = head;while (other != null) { // 我们假定这个head是不为空的。if (other.data.equals(data)) {Node<T> t = new Node<T>(insertData);t.prev = other;t.next = other.next;// 对新插入的数据进行一个指向的定义other.next = t;if (t.next == null) {last = t;}length++;}other = other.next;}}/*** 删除,删除指定的数据* * @param data*/public void remove(T data) {other = head;// 我们假定这个head是不为空的。while (other != null) {if (other.data.equals(data)) {other.prev.next = other.next;length--;}other = other.next;}}/*** 测试打印数据*/public void printList() {other = head;for (int i = 0; i < length; i++) {System.out.println(other.data + "  ");other = other.next;}}public static void main(String[] args) {DoubleLinkTest<Integer> link = new DoubleLinkTest<Integer>();link.add(1);link.add(2);link.add(3);link.add(5);link.add(6);link.add(7);link.printList();System.out.println(" ============== ");System.out.println(" ==== 在3后面添加一个数据开始========== ");link.addAfter(3, 99);link.printList();System.out.println(" ==== 在3后面添加一个数据结束========== " + "\r\n");System.out.println(" ==== 移除一个数据开始========== ");link.remove(99);link.printList();System.out.println(" \r\n");}}

运行main函数,可以看到控制台的打印输出:

java模拟双向链表实现相关推荐

  1. Java模拟一个简单的双向链表

    Java模拟一个简单的双向链表 1.链表结构 Node实体类代码: public class Node {public Object item;//存放数据的地方public Node next;// ...

  2. java 模拟时钟_java模拟时钟

    本次课程设计采用时间片轮转调度算法来实现模拟进程调度任务的执行过 程. 用 Java 模拟进程调度过程,可以方便地将运行结果直观地表示出来.Java 语言 独有的多...... 本次课程设计采用时间片 ...

  3. 233网校java_java辅导:使用java模拟登陆考试大

    java辅导:使用java模拟登陆考试大 2009年1月5日来源:233网校网校课程 在线题库评论 分享到 public static void loginexamda() { URL url = n ...

  4. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  5. 用Java模拟multipart形式的Http Post请求

    本例通过java模拟了Http的request请求,请求格式为multipart,实现了向服务器同时传递json数据和图片数据. 1 import java.io.ByteArrayOutputStr ...

  6. java 模拟grep_java模拟linux命令grep

    java模拟linux命令grep. 在网上看到matlab模拟linux的grep命令,就想到用java也来模拟下linux命令grep, 算法非常简单,,这里直接上代码: /** * 模拟Unix ...

  7. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  8. java模拟连接超时_Java:使用Toxiproxy模拟各种连接问题

    java模拟连接超时 用Toxiproxy和Java的HttpURLConnection模拟各种连接问题,以查看产生了什么样的错误:连接超时vs.读取超时vs.连接被拒绝-. 结果: 系统:openj ...

  9. curl命令java_上curl java 模拟http请求

    最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...

最新文章

  1. Scenario 7 – HP C7000 VC FlexFabric Tunneled VLANs and SUS A/A vSphere
  2. promise的状态以及api介绍_2019年,盘点一些我出过的前端面试题以及对求职者的建议
  3. 哈夫曼编码原理分析及代码实现(有注释)
  4. JavaScript生成唯一uuid
  5. 网络协议抓包分析与爬虫入门
  6. 设置新版谷歌浏览器自动启用flash
  7. shell 编程大全
  8. python迷宫小游戏代码_python迷宫游戏,迷宫生成,解决与可视化
  9. web技术分享| AudioContext 实现音频可视化
  10. 2021/9/2 BLE PRA 广播包
  11. Kafka入门教程及安装
  12. 【Codeforces 924C】Riverside Curio
  13. 刚毕业月薪3000,心好慌
  14. VUE弹窗加载另一个VUE页面
  15. jira 切换 语言_JIRA中的标记语言的语法参考
  16. 系统DIY:雨林木风YlmF系统DIY Y1.5(转)
  17. 你不知道的冷知识:JSON.stringify 居然还能这样用?
  18. 马云个人名义捐款华为_扒一扒马云的捐款
  19. python计算夏令时的具体日期_Python中的夏令时
  20. 用java构建企业级自动化框架(首篇-制定测试者使用语言1)

热门文章

  1. LINQ to XML 编程基础
  2. Package vim is not available, but is referred to by another package.
  3. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检
  4. 洛谷——P1017 进制转换
  5. 我在项目中对 MySQL 做的优化
  6. 细节:js 对象继承的几种模式举例
  7. PHP操作Memcache实例介绍
  8. 之前画得太丑了,再来张好看的.我试着改小点.但是就看不清了
  9. 安装Visual Studio 2005 SP1时遇到1718错误
  10. linux的安装方式(一)