package com.gec.linkedlist; //模拟单链表的增删改查 //链表实现水浒传的人物添加到链表的末端 public class SingleLinkedListDemo { public static void main(String[] args) { // 模拟链表 // 先创建英雄 HeroNode h1 = new HeroNode(1, "宋江"); HeroNode h2 = new HeroNode(2, "吴用"); HeroNode h3 = new HeroNode(3, "鲁智深"); HeroNode h4 = new HeroNode(4, "林冲"); // 创建链表 SingleLinkedList list = new SingleLinkedList(); // 把英雄添加到链表中 // list.add(h1); // list.add(h2); // list.add(h3); // list.add(h4); // 按顺序吧英雄添加 list.addByOrder(h3); list.addByOrder(h2); list.addByOrder(h4); list.addByOrder(h1); // 显示整个链表 list.showList(); System.out.println(); //把3号修改成鲁迅 HeroNode hn = new HeroNode(3, "鲁迅"); list.update(hn); //更新后再显示链表 list.showList(); System.out.println(); //删除 list.delete(4); System.out.println(); //删除后再显示链表 list.showList(); } } //定义一个SingleLinkedList 链表来管理英雄 class SingleLinkedList { // 初始化一个头结点,头结点不能动 private HeroNode head = new HeroNode(0, "英雄榜"); // 添加节点到单项链表 // 思路:不考虑编号顺序时 // 1 找到当前链表的最后一个节点 // 2 将这个next指向新的一个节点 public void add(HeroNode heroNode) { // 用一个临时变量表示头结点,然后一个一个向后找直到找到末尾 HeroNode temp = head; while (true) { // 如果下个一是空,证明已经找到了结尾,则退出循环 if (temp.next == null) { break; } temp = temp.next;// 将temp后移继续找 } // 退出循环时,temp已经在链表的最后 // 将temp的next指向新的节点 temp.next = heroNode; } // 按照顺序来添加 public void addByOrder(HeroNode heroNode) { // 思路:循环找到新英雄应该在的位置 // 用临时变量temp表示新英雄应该处在的位置的上一个英雄 // 新英雄的next指向temp的next // temp的next指向新英雄 HeroNode temp = head; boolean flag = false;// 定义一个布尔值表示是否存在此英雄,默认是false while (true) { // 如果已经没有下一个了,证明新英雄是排在最后的,直接返回 if (temp.next == null) { break; } // 如果英雄编号和已有编号相同,则不能添加 if (temp.next.no == heroNode.no) { flag = true; break; } // 当找到位置的时候,即temp的下一个位置已经在当前英雄的后面 if (temp.next.no > heroNode.no) { break; } // 让temp继续往后 temp = temp.next; } // 如果flag为true,则不能加英雄,退出方法 if (flag) { System.out.println("英雄" + heroNode.no + "已存在,无法加入"); } // 添加新英雄 else { heroNode.next = temp.next; temp.next = heroNode; } } //删除某个节点 public void delete(int no) { //定义一个临时变量,从头节点开始 HeroNode temp = head; //循环链表找该节点,注意通过temp.next.no来找 while(true) { if(temp.next==null) { System.out.println("没找到这个节点,删除失败"); return; } //如果找到了 if(temp.next.no==no) { temp.next=temp.next.next; return; } temp=temp.next;//每一次将temp后移 } } // 根据no来修改某个英雄的名字 public void update(HeroNode newHeroNode) { HeroNode temp = head.next; if(temp.next==null) { System.out.println("链表是空的,无法修改"); return; } //设置一个标记,当找到要修改的英雄编号时设置为true boolean flag = false; while(true) { if(temp == null) { System.out.println("找到结尾也没找到这个英雄"); break; } if(temp.no==newHeroNode.no) { flag = true; break; } temp = temp.next; } if(flag) { temp.name = newHeroNode.name; } } // 显示整个链表(遍历) public void showList() { // 判断链表是否为空 if (head.next == null) { System.out.println("链表是空的"); return; } // 用一个临时变量表示头结点,然后一个一个向后找直到找到末尾 HeroNode temp = head; while (true) { if (temp.next == null) { break; } // 输出节点信息 System.out.println(temp.next); // 如果到末尾,则退出循环 // 将temp后移 temp = temp.next; } } } //定义一个heronode,每一个heronode对象就是链表中的一个节点 class HeroNode { int no; String name; HeroNode next;// 表示下一个节点 public HeroNode(int no, String name) { super(); this.no = no; this.name = name; } @Override public String toString() { return "HeroNode [no=" + no + ", name=" + name + "]"; } }
全部评论
(0) 回帖