水浒传英雄单链表实现

//定义一个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
今日推荐