升级之前的单链表
    根据排名将英雄插入到指定位置(排序了,如果有这个排名,则添加失败,并给出提示)

    分析示意图:
    image.png

    1. package com.atguigu.linkedlist;
    2. /**
    3. * @author Dxkstart
    4. * @create 2021-09-30-16:57
    5. */
    6. public class SingleLinkedListDemo2 {
    7. public static void main(String[] args) {
    8. //进行测试
    9. //先创建节点
    10. HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");
    11. HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");
    12. HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");
    13. HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");
    14. //先创建一个链表
    15. SingleLinkedList2 singleLinkedList = new SingleLinkedList2();
    16. //加入
    17. singleLinkedList.addByOrder(hero2);
    18. singleLinkedList.addByOrder(hero4);
    19. singleLinkedList.addByOrder(hero3);
    20. singleLinkedList.addByOrder(hero1);
    21. //显示链表
    22. singleLinkedList.list();
    23. }
    24. }
    25. //定义HeroNode,每个HeroNode对象就是一个节点
    26. class HeroNode2 {
    27. public int no;
    28. public String name;
    29. public String nickname;
    30. public HeroNode2 next;//指向下一个节点,“链”
    31. //构造器
    32. public HeroNode2(int no, String name, String nickname) {
    33. this.no = no;
    34. this.name = name;
    35. this.nickname = nickname;
    36. }
    37. //为了显示方便,重写toString()方法
    38. @Override
    39. public String toString() {
    40. return "HeroNode{" +
    41. "no=" + no +
    42. ", name='" + name +
    43. ", nickname='" + nickname +
    44. '}';
    45. }
    46. }
    47. //定义SingleLinkedList管理我们的英雄
    48. class SingleLinkedList2 {
    49. //先初始化一个头结点,头结点不要动,不存放具体的数据
    50. private HeroNode2 head = new HeroNode2(0, "", "");
    51. //第二种方式在添加英雄时,根据排名将英雄插入到指定位置
    52. //(如果有这个排名,则添加失败,并给出提示)
    53. public void addByOrder(HeroNode2 heroNode) {
    54. //因为头结点不能动,因此我们仍然通过一个辅助指针(辅助变量)来帮助找到添加的位置
    55. // //因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则插入不了
    56. //这是老师写的
    57. // HeroNode2 temp = head;
    58. // Boolean flag = false;//flag标志添加的编号是否存在,默认为false
    59. // while (true){
    60. // if (temp.next == null){//说明temp已经在链表的最后
    61. // break;
    62. // }
    63. // if (temp.next.no > heroNode.no){//位置找到了,就在temp的后面插入
    64. // break;
    65. // }else if (temp.next.no == heroNode.no){//说明希望添加的heroNode已经存在
    66. // flag = true;//说明编号已存在
    67. // System.out.printf("准备插入的英雄的标号%d已存在,不能再加入了\n",heroNode.no);
    68. // break;
    69. // }
    70. // temp = temp.next;//temp后移,相当于遍历当前链表
    71. // }
    72. // //判断flag的值
    73. // if (!flag){
    74. // //插入到链表中,temp的后面
    75. // heroNode.next = temp.next;
    76. // temp.next = heroNode;
    77. // }
    78. //这是自己改进的代码,暂时没有bug
    79. HeroNode2 temp = head;
    80. while (true) {
    81. if (temp.next == null) {//说明temp已经在链表的最后
    82. temp.next = heroNode;
    83. break;
    84. } else if (temp.next.no == heroNode.no) {//说明希望添加的heroNode已经存在
    85. System.out.printf("准备插入的英雄的标号%d已存在,不能再加入了\n", heroNode.no);
    86. break;
    87. } else if (temp.next.no > heroNode.no) {//位置找到了,就在temp的后面插入
    88. //插入到链表中,temp的后面
    89. heroNode.next = temp.next;
    90. temp.next = heroNode;
    91. break;
    92. }
    93. temp = temp.next;//temp后移,相当于遍历当前链表
    94. }
    95. }
    96. //显示链表[遍历]
    97. public void list() {
    98. if (head.next == null) {
    99. System.out.println("链表为空!");
    100. return;
    101. }
    102. //头结点不能动,所以使用temp临时变量
    103. HeroNode2 temp = head;
    104. while (true) {
    105. //判断是否到链表的最后了
    106. if (temp.next == null) {
    107. break;
    108. }
    109. //输出节点信息
    110. System.out.println(temp.next);
    111. //将temp后移,不然是个死循环
    112. temp = temp.next;
    113. }
    114. }
    115. }