public class DoubleLinkedListDemo {public static void main(String[] args) {System.out.println("双向链表的测试");HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");HeroNode2 hero2 = new HeroNode2(2, "卢金义", "玉麒麟");HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");//创建一个双向链表对象DoubleLinkedList doubleLinkedList = new DoubleLinkedList();doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);doubleLinkedList.list();//修改HeroNode2 hero5  = new HeroNode2(4, "公孙胜", "入云龙");doubleLinkedList.update(hero5);System.out.println("修改后的链表测试");doubleLinkedList.list();//删除doubleLinkedList.delete(3);System.out.println("删除后的链表情况");doubleLinkedList.list();}static class DoubleLinkedList {private HeroNode2 head = new HeroNode2(0, "", "");public HeroNode2 getHead() {return head;}/*** 遍历显示链表*/public void list() {if (head.next == null) {System.out.println("链表为空");return;}HeroNode2 temp = head.next;while (true) {//判断链表是否到最后if (temp == null) {break;}System.out.println(temp);temp = temp.next;}}public void add(HeroNode2 heroNode) {HeroNode2 temp = head;while (true) {if (temp.next == null) {break;}temp = temp.next;}//形成一个双向链表,形成一个节点到双向链表的最后temp.next = heroNode;heroNode.pre = temp;}/*** 第一个方法肯定是有序的添加数据,也可以叫插入* 加入的是对象,即链表的一个部分*/public void addOrder(HeroNode2 heroNode) {//1.我们需要一个辅助指针帮助遍历,让它成为头结点HeroNode2 temp = head;//2.需要标志flag来判断数据是否可添加boolean flag = false;//在将数据插入链表时,会有三种情况//单纯的while-true 必须在每个条件下都加入breakwhile (true) {//如果temp指向了null 说明链表已经到了尾部,直接退出循环if (temp.next == null) {break;}//如果temp指向的节点序号大于要插入的节点,说明找到了插入的位置if (temp.next.num > heroNode.num) {break;}//如果temp指向的节点序号等于要插入的节点,说明这个节点已经插入过if (temp.next.num == heroNode.num) {//那么此时我们将flag改成true,以便下文flag = true;break;}//如果三种情况都没发生,那么指针下移temp = temp.next;}//如果是因为已经存在而终止循环,那么if (flag) {System.out.printf("已经存在%d", heroNode.num);}//如果是正常到了插入的位置,要进行链表独有的三方会转else {heroNode.next = temp.next;temp.next = heroNode;}}//链表的修改,修改一个节点的内容,和单向链表一样public void update(HeroNode2 newHeroNode) {if (head.next == null) {System.out.println("链表为空");return;}HeroNode2 temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.num == newHeroNode.num) {flag = true;break;} else {temp = temp.next;}}if (flag) {temp.nickname = newHeroNode.nickname;temp.name = newHeroNode.name;} else {System.out.println("没有扎到");}}/*** 添加之后是删除,这里定义的就肯定不是你想删除的对象了* 而是你想删除对象的序号即可,即以属性代表目标* 对于双向链表,可以直接找到要删除的节点,而不是前一个节点* 找到后自我删除即可*/public void delete(int num) {//判断当前链表是否为空if (head.next == null) {System.out.println("链表为空,无法删除");return;}//1.定义一个辅助指针HeroNode2 temp = head.next;//2.定义标志flag判断数据是否可添加boolean flag = false;while (true) {//已经到了链表的最后节点的nextif (temp == null) {break;}//找到带删除结点的前一个节点,只有这一个条件是正确的if (temp.num == num) {flag = true;break;}//后移,遍历temp = temp.next;}//找到了这个节点if (flag) {//temp.next = temp.next.next;temp.pre.next = temp.next;//代码有风险,如果temp是最后一个节点,会出现空指针异常if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.printf("要删除的%d节点不存在", num);}}}/*** 这是一个链表类,每个HeroNode就是一个节点* 在这里需要定义我们需要的链表的一些属性* 比如此链表定义了num,name,nickname* 当然最重要的是定义指向下一个节点的next*/static class HeroNode2 {public int num;public String name;public String nickname;public HeroNode2 next;public HeroNode2 pre;/*** 链表类的第一个方法当然是创建链表,这里显然利用构造方法* 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。*/public HeroNode2(int num, String name, String nickname) {this.num = num;this.name = name;this.nickname = nickname;}/*** 接着重写一个toString方法,目的是返回对象的内容*/@Overridepublic String toString() {return "HeroNode{" +"num=" + num +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}}
}

java实现简单的双向链表相关推荐

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

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

  2. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  3. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  4. Java JNI简单实现

    Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...

  5. java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例

    使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...

  6. 用limit 实现java的简单分页

    https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...

  7. redis java应用_redis在JAVA的简单应用

    reids是一个高性能的key-value数据库.它存储的value支持各种类型的数据,如String,List,set,hash类型.在此基础上,各种不同方式的排序. 本文不具体争对redis数据库 ...

  8. java实现简单的约瑟夫环问题

    我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码.  在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄 ...

  9. Java Kafka 简单示例

    Java Kafka 简单示例 简介     Java kafka 简单代码示例 maven依赖配置 <!-- kafka --> <dependency><groupI ...

最新文章

  1. Serverless Kubernetes:理想,现实与未来
  2. 阅读笔记五2017.2.13
  3. high-speed A/D performance metrics and Amplifie...
  4. Qt creator5.7 OpenCV249之pyrUp函数(含源码下载)
  5. ELV局部视图与差分隐私【敏感度到底怎么理解】【上】
  6. 【SparkStreaming学习之二】 SparkStreaming算子操作
  7. JavaScript学习(四十五)—练习题
  8. java api 获取jvm实例_JVMTI那些事——和Java相互调用
  9. sql转java对象_关于hibernate中使用sql语句时,类对象的转换问题。
  10. Java面试题-Java中的锁
  11. django03配置相关
  12. 2021年上半年数据库系统工程师下午真题及答案解析
  13. nagios监控详解
  14. oracle vm 强制关机,[已解决]Virtualbox安装archlinux过程中客户机和宿主机全部卡死...
  15. 十字链表画法——蓝墨云班课实践改错
  16. 神经网络利用哪种算法将损失函数的值降到最低
  17. 免费数据 | CnOpenData国际足球比赛结果数据
  18. 15个Python入门小程序,同事准时下班“小技巧”被我发现了
  19. ubuntu英文版变成中文版
  20. 商业研究(16):实体经济之殇,互联网经济之困?

热门文章

  1. HTML5实现头像的上传
  2. 列表li边框重合问题
  3. 【如何独自开发一个应用或网站?成本预算是多少?】
  4. Flink等多组件受影响,Apache Log4j曝史诗级漏洞
  5. 极大似然估计及其应用
  6. Azure File Storage 基本用法 -- Azure Storage 之 File
  7. 【物联网竞赛LoRa板实现呼吸灯和流水灯功能】
  8. 【虚拟机装黑苹果(第二弹)】Win10/macOS环境下制作黑苹果安装U盘(能被Vmware虚拟机识别)
  9. emqx集群+nginx负载均衡
  10. Hbase架构(二)