尚硅谷java数据结构与算法 韩顺平 单链表增删改查的实现

 day3 学习

package LinkedList;

public class SingleLinkedListDemo {

	public static void main(String[] args) {
		// 进行测试
		// 先创建节点
		HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
		HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");

		// 创建链表
		SingleLinkedList singleLinkedList = new SingleLinkedList();
//		//加入节点
//		singleLinkedList.add(hero1);
//		singleLinkedList.add(hero2);
//		singleLinkedList.add(hero3);
//		singleLinkedList.add(hero4);

		// 按排序加入节点
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero2);
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero3);

		// 显示
		singleLinkedList.list();
		System.out.println("-----------------------------");

		// 测试修改节点
		HeroNode hero5 = new HeroNode(1, "宋江。。", "及时雨~~");
		singleLinkedList.updata(hero5);

		// 测试删除节点
		singleLinkedList.delete(1);
		// 显示
		singleLinkedList.list();
		System.out.println("-----------------------------");
		singleLinkedList.query(2);

	}

}

//定义一个SingleLinkedList
class SingleLinkedList {
	// 先初始化一个头节点,头结点不要动,不存放具体数据
	private HeroNode head = new HeroNode(0, "", "");

	// 添加节点到单向链表
	// 思路:当不考虑编号的顺序时,找到当前链表的最后节点,将最后节点的next指向新节点
	public void add(HeroNode heroNode) {
		// 因为head节点不能动 因此我们需要一个辅助变量temp
		HeroNode temp = head;
		// 遍历链表找到最后
		while (true) {
			if (temp.next == null) {
				break;

			}
			temp = temp.next;// temp节点后移
		}
		// 当退出while循环时temp就指向了链表的最后
		// 将最后这个节点的next指向新的节点
		temp.next = heroNode;
	}

	// 第二种方式添加英雄时按排名插入到指定位置
	// 如果添加的排名重复了则添加失败
	public void addByOrder(HeroNode heroNode) {
		// 因为head节点不能动 因此我们需要一个辅助变量temp
		HeroNode temp = head;
		boolean flag = false;// 标志添加的编号是否存在 默认不存在
		// 遍历链表找到最后
		while (true) {
			if (temp.next == null) {// 说明已经到最后
				break;
			}
			if (temp.next.no > heroNode.no) {// 位置找到就在temp后插入
				break;

			} else if (temp.next.no == heroNode.no) {
				flag = true;// 说明编号存在
				break;
			}
			temp = temp.next;// temp节点后移
		}
		// 判断flag值
		if (flag) {
			System.out.println("英雄已经存在");

		} else {
			heroNode.next = temp.next;
			temp.next = heroNode;
			System.out.println("添加成功");
		}
	}

	// 修改节点信息,根据no编号来修改 即no不能被修改
	public void updata(HeroNode heroNode) {
		// 判断是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		// 找到需要修改的节点
		// 定义一个辅助变量
		HeroNode temp = head.next;
		boolean flag = false;// 表示是否找到节点
		while (true) {
			if (temp == null) {
				break;// 遍历完
			}
			if (temp.no == heroNode.no) {
				flag = true;
				break;
			}
			temp = temp.next;

		}
		// 根据flag判断是否找到
		if (flag) {
			temp.name = heroNode.name;
			temp.nickname = heroNode.nickname;
		} else {
			System.out.println("没找到");
		}
	}
//删除某个序号的节点
	public void delete(int no) {
		HeroNode temp = head;
		boolean flag = false;// 标志是否找到待删除节点的前一个节点
		while (true) {
			if (temp.next == null) {// 已经到链表最后
				break;
			}
			if (temp.next.no == no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.next = temp.next.next;
		} else {
			System.out.println("没有找到需要删除的节点");
		}
	}

	// 查找是否存在某序号节点
	public void query(int no) {
		HeroNode temp = head;
		boolean flag = false;// 标志是否找到节点
		while (true) {
			if (temp.next == null) {
				break;
			}
			if (temp.no == no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			System.out.println("找到的节点是" + temp);
		} else {
			System.out.println("未找到匹配的节点");
		}

	}

	// 显示链表
	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;
		}
	}

}

//定义一个HeroNode,每个对象都是一个节点
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方法

}

你可能感兴趣的:(java算法学习,数据结构,java,算法)