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方法 }