public class HeroNode2 {public int no;public String name;public String nickname;public HeroNode2 next;   //指向下一个节点public HeroNode2 prev;   //指向上一个节点public HeroNode2(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}@Overridepublic String toString() {return "HeroNode2{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}
/*** 双向链表 简单实现*/
public class DoubleLinkedList {private HeroNode2 head;private int size;public DoubleLinkedList(){this.head = new HeroNode2(0,null,null);this.size = 0;}/*** 添加节点* @param newNode*/public void addNode(HeroNode2 newNode){//如果当前没有元素if(head.next == null){//将当前链表第一个节点.next = newNodehead.next = newNode;}else{HeroNode2 temp = head.next;while(true){if(temp.next == null){break;}temp = temp.next;}//最后一个链表节点.next = newNodetemp.next = newNode;//新节点的前一个节点指向最后链表的一个节点 newNode.prev = temp;newNode.prev = temp;}++size;  //增加链表长度}/*** 修改链表 (这里修改名字就好)* @param index* @param newNode*/public void modifyNode(int index,HeroNode2 newNode){if(isEmpty()){System.out.println("当前链表为空,无法修改元素");return;}if(index < 0 || index >= size){System.out.println("修改链表的索引范围必须在 0 <= index < " + size);return;}HeroNode2 temp = head.next;int currentIndex = 0;while (temp != null){if(currentIndex == index){temp.no = newNode.no;temp.name = newNode.name;temp.nickname = newNode.nickname;break;}temp = temp.next;++currentIndex;}}//删除第一个元素,删除最后一个元素,列表中只剩一个元素/*** 删除链表中某个索引的节点* @param index*/public void deleteNode(int index){if(isEmpty()){System.out.println("链表为空~~");return;}if(index < 0 || index >= size){System.out.println("删除链表节点的索引范围必须在 0 <= index < " + size);return;}HeroNode2 temp = head.next;if(index == 0){head.next = temp.next;if(head.next != null){temp.next.prev = null;}}else{int currIndex = 0;while (temp.next != null){if(currIndex == index){break;}temp = temp.next;++currIndex;}//如果是删除最后一个元素 temp.next == null --》 temp.next.prev = temp.prev; 这条逻辑语句就不用走if(temp.next != null){temp.next.prev = temp.prev;}temp.prev.next = temp.next;}--size;  // 链表长度 - 1}public void printList(){if(isEmpty()){System.out.println("链表为空~~~");}HeroNode2 temp = head.next;while (temp != null){System.out.println(temp);temp = temp.next;}}/*** 判断链表的元素个数是否为空* @return*/public boolean isEmpty(){return size == 0;}/*** 将新节点插入在链表的某个索引上,原先在该索引的节点后移* @param index* @param newNode*/public void insertNode(int index,HeroNode2 newNode){if(index < 0 || index >= size){System.out.println("插入链表节点的索引范围必须在 0 <= index < " + size);return;}if(index == 0){insertNodeToHead(newNode);}else{//确定原先在该索引上的元素//在这里我们首先要 找到 链表在 index这个索引值下 的节点//index = 1 ==>直接找链表的第2个元素开始算起HeroNode2 temp = head.next.next;int currentIndex = 1;while(temp != null){if(currentIndex == index){//前一部分  【temp.prev】 的 next节点 ==》 newNode; newNode.prev ==> 【temp.prev】temp.prev.next = newNode;newNode.prev = temp.prev;//后一部分  新节点 与 【temp】 节点的关系建立newNode.next = temp;temp.prev = newNode;break;}temp = temp.next;++currentIndex;}++size;  //链表长度+1}}/*** 将新节点插入到链表中,此新节点是链表的第一个元素* @param newNode*/public void insertNodeToHead(HeroNode2 newNode){HeroNode2 temp = head.next;head.next = newNode;  //头节点 的下一个节点 指向===> 新节点newNode.next = temp;  //新节点的下一个节点 指向 原先链表的第一个节点temptemp.prev = newNode;  //原先链表的第一个节点 的前一个节点指向 新节点++size; //链表长度+1}public static void main(String[] args) {DoubleLinkedList linkedList = new DoubleLinkedList();HeroNode2 node1 = new HeroNode2(1,"曹操","孟德");HeroNode2 node2 = new HeroNode2(2,"关羽","云长");HeroNode2 node3 = new HeroNode2(3,"郭嘉","奉孝");HeroNode2 node4 = new HeroNode2(4,"荀阈","文若");HeroNode2 node5 = new HeroNode2(5,"典韦","文满");linkedList.addNode(node1);linkedList.addNode(node2);
//        linkedList.addNode(node3);
//        linkedList.addNode(node4);
//        linkedList.addNode(node5);//        System.out.println("=========================start1=======================");
//        linkedList.addNode(node1);
//        linkedList.addNode(node2);
//        linkedList.printList();
//        System.out.println("====================");
//        linkedList.deleteNode(0);
//        linkedList.printList();
//        System.out.println("====================");
//        linkedList.deleteNode(0);
//        linkedList.printList();
//        System.out.println("=========================end1=======================");//        System.out.println("=============start2===============");
//
//        linkedList.addNode(node1);
//        linkedList.addNode(node2);
//        linkedList.addNode(node3);
//        linkedList.addNode(node4);
//        linkedList.addNode(node5);
//        linkedList.printList();
//        System.out.println(linkedList.size);
//
//        System.out.println("============================");
//        //删除第一个元素
//        linkedList.deleteNode(0);
//        linkedList.printList();
//        System.out.println(linkedList.size);
//
//        System.out.println("============================");
//        linkedList.deleteNode(3);
//        linkedList.printList();
//        System.out.println(linkedList.size);
//
//        System.out.println("===========================");
//        linkedList.deleteNode(1);
//        linkedList.printList();
//        System.out.println(linkedList.size);
//
//        System.out.println("=============end2===============");//        System.out.println("==============start3===============");
//        linkedList.addNode(node1);
//        linkedList.addNode(node2);
//        linkedList.addNode(node3);
//        linkedList.addNode(node4);
//        linkedList.addNode(node5);
//        linkedList.printList();
//        System.out.println(linkedList.size);linkedList.insertNodeToHead(new HeroNode2(6,"许楮","仲康"));linkedList.printList();System.out.println(linkedList.size);
//
//        System.out.println("===================================");
//        linkedList.insertNode(1,new HeroNode2(6,"许楮","仲康"));
//        linkedList.printList();
//        System.out.println(linkedList.size);
//
//        System.out.println("===================================");
//        linkedList.insertNode(4,new HeroNode2(8,"许楮ABC","仲康"));
//        linkedList.printList();
//        System.out.println("=====================================");
//        linkedList.insertNode(6,new HeroNode2(8,"test1","test1"));
//        linkedList.printList();
//        System.out.println("==============end3=================");//        System.out.println("============================");
//        System.out.println(linkedList.size);
//        HeroNode2 node6 = new HeroNode2(6,"许楮","仲康");
//
//        linkedList.modifyNode(4,node6);
//
//        System.out.println("============================");
//        linkedList.printList();}}

双向链表(java语言实现)相关推荐

  1. 2019 Android 高级面试题总结 从java语言到AIDL使用与原理

    说下你所知道的设计模式与使用场景 a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如C ...

  2. 2006年4月全国计算机等级考试二级Java语言程序设计

    (考试时间90分钟,满分100分) 一.选择题((1)~(35)每小题2分,共70分)     下列各题A).B).C).D)四个选项中,只有一个选项是正确的,请将正确选项写在答题卡相应位置上,答在试 ...

  3. Go语言与Java语言对比

    Go与Java 零.GoApi文档和中文社区网址 Go的中文api文档:https://studygolang.com/pkgdoc Go中文社区网站:https://studygolang.com/ ...

  4. 【java后端学习】java语言基础(夯实基础)

    文章目录 一.基础语法 1 java中的标识符 1.1 变量命名规范 1.2 保留字 2 java中的常量 3 java基本数据类型 4 数组 5 字符及字符串 6 运算符 7 控制语句 for语句 ...

  5. 算法和数据结构(Java语言)

    算法和数据结构(Java语言) 持续更新中- 线性结构和非线性结构 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和链式 ...

  6. 数据结构之链表(java语言实现)

    链表的底层储存结构: 相对于数组这一需要连续.足够大空间的数据结构,链表只需要利用"指针"将一组零碎的空间(在链表中称之为节点)串联起来,这样就可以避免在创建数组时一次性申请过大的 ...

  7. 清华大学《Java语言程序设计进阶》公开课总结

    点击查看:原文 本文是清华大学许斌老师的公开课:Java语言程序设计进阶 的课堂笔记,快速复习一下,时间有限,因此大量直接截图.许斌老师声明:没有配套讲义,建议参考书籍:周志明<深入理解java ...

  8. 二级(JAVA语言程序设计)考试大纲

    二级(Java 语言程序设计)考试大纲 2021计算机Java二级考试四十五套题真题[收藏版](一周裸考计划) 基本要求 1.掌握算法的基本概念 2.掌握基本数据结构及其操作. 3.掌握基本排序和查找 ...

  9. Java语言中的数据类型

    Java语言是一种强调数据类型的语言,在声明任何变量时,必须将该变量定义为一种数据类型. Java中的数据类型包括基本类型和对象类型,基本类型总共有8种,其中4种整形.1种字符型.2种浮点型.1种布尔 ...

最新文章

  1. 【JavsScript】推荐五款流行的JavaScript模板引擎
  2. netframework转core时文件响应流问题
  3. 被误解的MVC和被神化的MVVM
  4. Pandas常用I/O(一)------read_csv(),read_table()
  5. caffe中通过prototxt文件查看神经网络模型结构的方法
  6. CentOS上使用OpenStack的一些问题
  7. ZOJ1101-赌徒【二分查找】
  8. mysql dba环境验收_面对一个全新的环境,作为一个Mysql DBA,应该了解
  9. 《精通Spring 4.x 企业应用开发实战》读书笔记
  10. 6个用于大数据分析的最好工具(转)
  11. 成为高级测试人:软件测试工程师职业素养
  12. css制作俄罗斯方块,H5原创俄罗斯方块(基于canvas)
  13. 磁盘文件系统Fat、Fat32、NTFS、exFAT的优缺点
  14. 免费 web api 接口大全
  15. Druid数据库连接池异常--求助问题贴
  16. 干货 | SQL 外部联接 Outer Join
  17. Daniel Sabbah:软件工程的转折点
  18. C# 从TTF文件加载自定义字体
  19. 9种常用的软件容错处理方式
  20. 黑群晖升级后无法找到的方法

热门文章

  1. 罗克韦尔AB PLC RSLogix模拟量IO模块基本介绍
  2. C++——不使用sqrt实现开根号
  3. Pytorch学习之torch----Reduction Ops
  4. ZFS-128bit文件系统
  5. 数据吞吐高达 21 亿条!实时计算在贝壳找房的应用实践
  6. php warning require,Thinkphp 网站打开提示Warning: require(): open_basedir restriction in effect另一种解决方法...
  7. 2020写给未来 100w 粉丝的年终总结
  8. Unity简单实现电量、充电状态显示
  9. 乡村老师网络计算机培训日志,乡村教师网络研修心得体会
  10. 人只需要成功一次就够了