1.单链表:
单链表:
第一种直接在尾部进行添加:
public class SingleLinkedListDemo {
public static void main(String[] args) {
//测试
HeroNode heroNode = new HeroNode(1,"宋江","狗杂种");
HeroNode heroNode2 = new HeroNode(2,"林冲","豹子头");
HeroNode heroNode3 = new HeroNode(3,"吴用","狗腿子");
HeroNode heroNode4 = new HeroNode(4,"李逵","大二愣子");
//将上面的元素添加到链表中
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(heroNode);
singleLinkedList.add(heroNode3);
singleLinkedList.add(heroNode2);
singleLinkedList.add(heroNode4);
//遍历
singleLinkedList.list();
}
}
class SingleLinkedList{
//先初始化一个头节点,头节点不能动,不存放任何数据
HeroNode head = new HeroNode(0,"","");
public void add(HeroNode heroNode){
//因为头节不能动 所以我们使用一个 tmp 中间节点来做完 head 节点的替代
HeroNode temp = head;
//遍历链表找到最后
while (true){
if (temp.next == null){
//找到链表最后
break;
}
temp = temp.next;
}
//当退出 while 循环时,temp就指向了链表的最后一个
//将最后一个的next添加 新元素
temp.next = heroNode;
}
//显示链表
public void list(){
//判断是否为空
if (head.next == null){
System.out.println("链表为空");
return;
}
//同上 head指针不能动 所以创一个中间变量
HeroNode temp = head;
while (true){
//判断链表是否为空
if (temp.next == null){
break;
}
//将temp后移
temp = temp.next;
System.out.println(temp);
}
}
}
class HeroNode{
public int no;
public String name;
public String nickName;
public HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "\n HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
第二种安照编号顺序插入:
//第二种方式添加英雄时,根据排名将英雄插入到指定位置 (如果有这个排名,则添加失败,并给出提示)
public void addByOrder(HeroNode heroNode){
//因为头节点不能动,所以创建一个辅助指针(变量)来帮助找到添加的位置
//因为单链表,因为我们找到的temp是位于添加位置的前一个节点,否则无法插入
HeroNode temp = head;
boolean flag = false; //flag 标示添加的编号是否存在,默认是false
while (true){
if (temp.next == null){ //说明 temp 已经是链表的最后了
break;
} else if (temp.next.no > heroNode.no){ //位置找到了,就在 temp 后面
break;
} else if (temp.next.no == heroNode.no){//说明希望添加的 heroNode 编号已经存在
flag = true; //编号存在
break;
}
temp = temp.next;
}
//判断 flag 的值
if (flag){ //不能添加,说明编号已经存在
System.out.printf("准备出入的英雄编号 %d 已经存在了,不能加入\n",heroNode.no);
}else {
//插到 temp 的后面
heroNode.next = temp.next;
temp.next = heroNode;
}
}
修改方法:
//修改方法
/**
* 修改节点的信息,根据 no 编号来进行修改,即 no 编号不能改
* 说明:1.根据 newHeroNode 的 no 来修改即可
* @param newHeroNode
*/
public void update(HeroNode newHeroNode){
//判断是否为空
if (head.next == null){
System.out.println("链表为空");
}
//定义辅助变量
HeroNode temp = head;
boolean flag = false; //表示是否找到修改的节点
while (true){
if (temp == null){
break; //已经遍历完链表
}else if (temp.no == newHeroNode.no){
//找到
flag = true;
break;
}
temp = temp.next;
}
//根据 flag 判断是否找到要修改的节点
if (flag){
temp.name = newHeroNode.name;;
temp.nickName = newHeroNode.nickName;
} else {