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.update(new HeroNode2(2, "玉麒麟", "卢俊义2"));
    23. //测试删除功能
    24. singleLinkedList.delete(1);
    25. //显示链表
    26. singleLinkedList.list();
    27. }
    28. }
    29. //定义HeroNode,每个HeroNode对象就是一个节点
    30. class HeroNode2 {
    31. public int no;
    32. public String name;
    33. public String nickname;
    34. public HeroNode2 next;//指向下一个节点,“链”
    35. //构造器
    36. public HeroNode2(int no, String name, String nickname) {
    37. this.no = no;
    38. this.name = name;
    39. this.nickname = nickname;
    40. }
    41. //为了显示方便,重写toString()方法
    42. @Override
    43. public String toString() {
    44. return "HeroNode{" +
    45. "no=" + no +
    46. ", name='" + name +
    47. ", nickname='" + nickname +
    48. '}';
    49. }
    50. }
    51. //定义SingleLinkedList管理我们的英雄
    52. class SingleLinkedList2 {
    53. //先初始化一个头结点,投机诶单不要动,不存放具体的数据
    54. private HeroNode2 head = new HeroNode2(0, "", "");
    55. //第二种方式在添加英雄时,根据排名将英雄插入到指定位置
    56. //(如果有这个排名,则添加失败,并给出提示)
    57. public void addByOrder(HeroNode2 heroNode) {
    58. //因为头结点不能动,因此我们仍然通过一个辅助指针(辅助变量)来帮助找到添加的位置
    59. //因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则插入不了
    60. //这是自己改进的代码,暂时没有bug
    61. HeroNode2 temp = head;
    62. while (true) {
    63. if (temp.next == null) {//说明temp已经在链表的最后
    64. temp.next = heroNode;
    65. break;
    66. } else if (temp.next.no == heroNode.no) {//说明希望添加的heroNode已经存在
    67. System.out.printf("准备插入的英雄的标号%d已存在,不能再加入了\n", heroNode.no);
    68. break;
    69. } else if (temp.next.no > heroNode.no) {//位置找到了,就在temp的后面插入
    70. //插入到链表中,temp的后面
    71. heroNode.next = temp.next;
    72. temp.next = heroNode;
    73. break;
    74. }
    75. temp = temp.next;//temp后移,相当于遍历当前链表
    76. }
    77. }
    78. //修改节点的信息,根据no编号来修改,即no编号不能改
    79. //说明
    80. //1.根据 newHeroNode的no来修改即可
    81. public void update(HeroNode2 newHeroNode) {
    82. //判断是否为空
    83. if (head.next == null) {
    84. System.out.println("链表为空~");
    85. return;
    86. }
    87. //找到需要修改的节点,根据no编号
    88. //定义一个辅助变量
    89. HeroNode2 temp = head;
    90. boolean flag = false;
    91. while (true) {
    92. if (temp.no == newHeroNode.no) {
    93. //找到了
    94. flag = true;
    95. break;
    96. }
    97. temp = temp.next;
    98. }
    99. //根据flag判断是否找到要修改的节点
    100. if (flag == true) {
    101. temp.name = newHeroNode.name;
    102. temp.nickname = newHeroNode.nickname;
    103. } else {
    104. System.out.printf("没有找到编号为%d的英雄的信息,不能修改!\n", newHeroNode.no);
    105. }
    106. }
    107. //删除节点
    108. //思路:
    109. //1.head不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
    110. //2.我们在比较时,时temp.next.no 和 需要删除的节点的no比较
    111. public void delete(int no) {
    112. HeroNode2 temp = head;
    113. boolean flag = false;//标志是否找到待删除的节点
    114. while (true) {
    115. if (temp == null) {
    116. break;
    117. }
    118. if (temp.next.no == no) {
    119. //找到了待删除节点的前一个节点
    120. flag = true;
    121. break;
    122. }
    123. temp = temp.next;
    124. }
    125. if (flag) {
    126. temp.next = temp.next.next;
    127. } else {
    128. System.out.printf("没有找到你要删除的%d号英雄\n", no);
    129. }
    130. }
    131. //显示链表[遍历]
    132. public void list() {
    133. if (head.next == null) {
    134. System.out.println("链表为空!");
    135. return;
    136. }
    137. //头结点不能动,所以使用temp临时变量
    138. HeroNode2 temp = head;
    139. while (true) {
    140. //判断是否到链表的最后了
    141. if (temp.next == null) {
    142. break;
    143. }
    144. //输出节点信息
    145. System.out.println(temp.next);
    146. //将temp后移,不然是个死循环
    147. temp = temp.next;
    148. }
    149. }
    150. }