//定义一个SingleLinkedList来管理英雄
class SingleLinkedList{
//先初始化一个头节点 头节点不能动
private HeroNode head = new HeroNode(0, "", "");//不存放数据
//返回头节点
public HeroNode getHead() {
return head;
}
//添加节点到单链表
//当不考虑编号的顺序时
//找到当前链表的最后的节点
//把最后这个节点的next 指向新的节点
public void add(HeroNode heroNode) {
//head节点不能动 因此需要一个辅助指针
HeroNode temp = head;
//遍历链表 找到最后
while(true) {
//找到链表的最后
if(temp.next == null) {
break;
}
//如果没有找到最后 就把temp后移
temp = temp.next;
}
temp.next = heroNode;
}
//当退出while循环时,temp指向了链表的最后
//显示链表 遍历
public void list() {
//判断链表是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
//头结点不能动 需要辅助节点
HeroNode temp = head.next;
while(true) {
//判断链表是否到达最后
if(temp == null) {
break;
}
//输出节点信息
System.out.println(temp);
//temp后移
temp = temp.next;
}
}
//第二种方式在添加英雄时,根据排名将英雄插入到指定位置
//(如果有这个排名,则添加失败,并给出提示)
public void addBy0rder(HeroNode heroNode) {
//因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
//因为单链表,因为我们找的temp是位于添加位置的前一一个节点,否则插入不了
HeroNode temp = head;
boolean flag = false;//添加的节点是否存在
while(true) {
if(temp.next == null) {//temp在链表的最后
break;
}
if(temp.next.no > heroNode.no) {//位置找到了 就在temp后面插入
break;
}else if (temp.next.no == heroNode.no) {//说明编号存在了
flag = true;
break;
}
temp = temp.next;
}
if(flag) {//编号重复 不能添加
System.out.println("已存在");
}else {
//插入到链表中
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//修改节点
//根据新节点的no进行修改
public void update(HeroNode newHeroNode) {
if(head.next == null) {
System.out.println("链表为空");
return;
}
//找到需要修改的节点
HeroNode temp = head;
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.println("没有找到节点");
}
}
/**
* head不动 用temp临时变量代替
* 比较temp.next.no herdNode.no
* 先找到待删除节点的前一个节点 用.next.next找下下个节点
* 被删除节点将不会有引用指向 会被垃圾回收机制回收
* @param heroNode
*/
public void delete(HeroNode heroNode) {
HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;//到达链表的最后
}
if(temp.next.no == heroNode.no) {
flag = true;//找到了待删除节点的前一个节点
break;
}
temp = temp.next;//后移实现遍历
}
//判断flag
if(flag) {
//删除
temp.next = temp.next.next;
}else {
System.out.println("此节点不存在");
}
}
}
//定义节点
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 "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
//为了显示方法 重写tostring
}
水浒传英雄单链表实现
猜你喜欢
转载自blog.csdn.net/NuanShuTT/article/details/107642306
今日推荐
周排行