1 package linkedlist; 2 3 public class SingleLinkedListDemo { 4 5 public static void main(String[] args) { 6 HeroNode hero1 = new HeroNode(1, "唐僧", "师傅"); 7 HeroNode hero2 = new HeroNode(2, "孙悟空", "大师兄"); 8 HeroNode hero3 = new HeroNode(3, "猪八戒", "二师兄"); 9 HeroNode hero4 = new HeroNode(4, "沙和尚", "三师弟"); 10 SingleLinedList singleLinedList = new SingleLinedList(); 11 12 // singleLinedList.add(hero1); 13 // singleLinedList.add(hero2); 14 // singleLinedList.add(hero3); 15 // singleLinedList.add(hero4); 16 17 singleLinedList.addByOrder(hero1); 18 singleLinedList.addByOrder(hero4); 19 singleLinedList.addByOrder(hero2); 20 singleLinedList.addByOrder(hero3); 21 singleLinedList.addByOrder(hero3); 22 //测试修改节点的代码 23 HeroNode newHeroNode = new HeroNode(2, "六耳猕猴", "假悟空"); 24 singleLinedList.update(newHeroNode); 25 // 删除一个节点 26 singleLinedList.del(2); 27 singleLinedList.del(3); 28 singleLinedList.list(); 29 } 30 31 } 32 33 //定义一个singleLinkedList 34 class SingleLinedList { 35 // 先初始化一个头节点,头节点不要动,不存放具体的数据 36 private HeroNode head = new HeroNode(0, "", ""); 37 // 添加节点到单向链表 38 // 1.找到当前链表的最后 39 // 2.将最后这个节点的next指向新的节点 40 41 public void add(HeroNode heronode) { 42 // 因为head节点不能动,因此我们需要一个辅助遍历temp 43 HeroNode temp = head; 44 while (true) { 45 if (temp.next == null) { 46 break; 47 } 48 temp = temp.next; 49 } 50 temp.next = heronode; 51 } 52 53 // 第二种方式在添加英雄时,根据排名将英雄插入到指定位置 54 // (如果有这个排名,则添加失败,并给出提示) 55 public void addByOrder(HeroNode heroNode) { 56 HeroNode temp = head; 57 boolean flag = false;// 标志添加的编号是否存在,默认为false 58 while (true) { 59 if (temp.next == null) { 60 break; 61 } 62 if (temp.next.no > heroNode.no) {// 位置找到在temp的后面加入 63 break; 64 65 } else if (temp.next.no == heroNode.no) { 66 flag = true; 67 break; 68 } 69 temp = temp.next; 70 } 71 if (flag == true) { 72 System.out.println("准备插入的英雄编号" + heroNode.no + "已经存在"); 73 74 } else { 75 heroNode.next = temp.next; 76 temp.next = heroNode; 77 } 78 } 79 80 //根据编号修改节点的信息 81 public void update(HeroNode newHeroNode) { 82 83 if (head.next == null) { 84 System.out.println("链表为空~"); 85 return; 86 } 87 HeroNode temp = head.next; 88 boolean flag = false; 89 while (true) { 90 if (temp == null) { 91 break;// 已经遍历完列表 92 } 93 if (temp.no == newHeroNode.no) { 94 flag = true; 95 break; 96 } 97 temp = temp.next; 98 } 99 // 根据flag,判断是否找到要修改的节点 100 if (flag) { 101 temp.name = newHeroNode.name; 102 temp.nickname = newHeroNode.nickname; 103 } else { 104 System.out.println("没有找到编号为" + newHeroNode.no + "的节点,不能修改"); 105 } 106 107 } 108 109 public void del(int no) { 110 HeroNode temp = head; 111 boolean flag = false; 112 while (true) { 113 if (temp.next == null) { 114 break; 115 } 116 if (temp.next.no == no) { 117 flag = true; 118 break; 119 } 120 temp = temp.next; 121 } 122 if (flag) { 123 temp.next = temp.next.next; 124 } else { 125 System.out.println("要删除的节点" + no + "不存在"); 126 } 127 } 128 129 // 显示链表【遍历】 130 public void list() { 131 if (head.next == null) { 132 System.out.println("链表为空"); 133 return; 134 } 135 HeroNode temp = head.next; 136 while (true) { 137 if (temp == null) { 138 break; 139 } 140 System.out.println(temp); 141 temp = temp.next; 142 } 143 } 144 145 } 146 147 //定义HeroNode,每个HeroNode对象就是一个节点 148 class HeroNode { 149 public int no; 150 public String name; 151 public String nickname; 152 public HeroNode next;// 指向下一个节点 153 154 // 构造器 155 public HeroNode(int no, String name, String nickname) { 156 super(); 157 this.no = no; 158 this.name = name; 159 this.nickname = nickname; 160 } 161 162 // 重写toString 163 @Override 164 public String toString() { 165 return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]"; 166 } 167 168 }