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 }