第二种:在添加英雄时,根据排名将英雄插入到指定位置
(如果有这个排名,则添加失败,并给出提示)
public void addByOrder(HeroNode heronode){
//因为头节点不能动,因此我们仍然需要一个辅助变量帮助找到添加的位置
//因为是单链表,因此我们找的temp是一个位于添加位置的前一个节点,否则插入不了
HeroNode temp=head;
boolean flag=false;//flag标志添加的编号已经存在,默认为false
while(true){//这一步遍历链表
if(temp.next==null){//说明temp已经位于链表的最后
break;//说明添加的节点就位于链表的最后
}
if(temp.next.no>heroNode.no){
break;//位置找到,就在temp后面插入,所以直接退出遍历
}else if(temp.next.no==heroNode.no){
//说明希望添加的heronode的编号已经存在
flag=true;//说明编号存在
break;
}
temp=temp.next;
//执行到此处,说明以上条件均不成立,temp需要向后移动,遍历当前链表
}
//判断flag的值
if (flag){//不能添加,说明编号存在
System.out.printf("准备插入的英雄编号%d已经存在,不能加入\n", heroNode.no);
}else {
//插入到链表中,temp的后面
heroNode.next=temp.next;
temp.next=heroNode;
}
}
//修改节点的信息,根据no编号来修改,即认为no编号不能改
//根据newHeroNode的no来修改
public void updata(HeroNode newHeroNode)
//判断是否为空
if(head.next== null){//因为头节点不存储数据
System.out.println("链表为空");
return;
}
//找到需要修改的节点,根据no编号
//定义一个辅助变量
HeroNode temp=head.next;
boolean flag=false;//表示是否找到该节点
while(true){
if{temp==null){//这步我个人觉得可以省略
break;
}
if(temp.no==newHeroNode.no){
//表示找到该节点
flag=true;
break;
}
temp=temp.next;
}
//根据flag,判断是否找到要修改的节点
if(flag){
temp.name=newHeroNode.name;
temp.nickname=newHeroNode.nickname;
}else{
//没有找到要修改的节点
System.out.printf("没有找到编号%d的节点,不能修改\n",newHeroNode.no);
}
}
//加入按照编号的顺序
singleLinkedList.addByOrder(hero1);
singleLinkedList.addByOrder(hero4);
singleLinkedList.addByOrder(hero2);
singleLinkedList.addByOrder(hero3);
singleLinkedList.addByOrder(hero3);
//测试要修改节点的代码
HeroNode newHeroNode= new HeroNode(2,"小卢","玉麒麟~~");
singleLinkedList.updata(newHeroNode);
System.out.println("修改后链表的情况");
singleLinkedList.list();
结果如下: