package day4; public class linklist { } //定义了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 + ''' + '}'; } } class singlelinklist{ // 初始化头节点,头节点不用动,不存放具体的数据。 heronode head =new heronode(0," "," "); // 添加节点到列表 // 思路:1.找到最后的节点,2.让节点的next指向要添加的节点。 node.next=新节点 public void add(heronode heronode){ heronode temp =head; //辅助节点 因为head节点不能动 // 遍历链表,找到最后 while (true){ // 找到链表的最后 if (temp.next == null){ break; //会跳出whlie } // 如果没有找到,就将temp后移。 temp =temp.next; } // 当退出了while循环,temp就指向了链表的最后 将这个节点的next指向新的节点 temp.next=heronode; } // 按照顺序添加 public void addbyno(heronode heronode){ // 头节点不能改变,所以要加入辅助变量 heronode temp =head; // 我们需要找到添加位置的前一个节点。 boolean flag =false; //flag是标志添加的编号是否存在,如果存在就不能重复添加 //思路 1.判断是否temp已经再链表的最后 2.判断是否temp的合适位置temp.next.no>heronode.no // 3.如果编号已经存在,则将flag变为true 4. 在判断的时候要后移temp 起始位置为head // 5.跳出while循环,则判断flag,否则则插入节点。 while (true){ if (temp.next==null){ //1 break; } if (temp.next.no>heronode.no){ //2 break; }else if(temp.next.no==heronode.no){ //3 flag =true; break; } temp=temp.next; //后移,遍历 } // 此处跳出了while循环,如果以上三个if任意一个跳出说明满足插入的条件,执行插入的语句 if (flag){ //说明插入重复,不能插入 System.out.printf("插入的值重复了为%dn",heronode.no); }else { // 插入元素的next指向下一个节点的值 前一个节点的next指向 插入的节点 heronode.next =temp.next; //temp.next就是原来temp后面的值。 temp.next =heronode; } } // 修改节点的信息 根据no来修改 public void update(heronode newheronode){ // 思路:1.判断链表是否为空 2.找到修改的节点 // 遍历 1.temp的no等于 newheronode的no 2.当temp=null 说明到了链表的末尾 if (head.next ==null){ System.out.println("链表为空"); return; } // 定义一个临时变量 heronode temp =head.next; boolean flag =false; //flag的含义表示是否找到节点 while (true){ if (temp ==null){ break; //已经遍历结束 } if (temp.no ==newheronode.no){ flag =true; break; } temp =temp.next; //将temp向后移动 } if (flag ==true){ System.out.printf("找到了要替换的节点编号为 %d",temp.no); // 替换 temp.nickname = newheronode.nickname; temp.name = newheronode.name; }else { System.out.printf("未找到编号为%d的节点",newheronode.no); } } // --------------------------------delete----------------------------------------- // 删除节点 根据他的no删除 // 思路:定义一个temp 遍历,找到这个节点的前一个节点为temp // 将temp.next=temp.next.next // 就完成了删除 public void delete(heronode newheronode){ heronode temp =head.next; while (true){ if (temp ==null){ System.out.println("此链表为空,只有一个头节点"); break; } if (temp.next.no ==newheronode.no){ break; } temp =temp.next; } temp.next =temp.next.next; } // 显示链表 public void show(){ 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 static void main(String[] args) { // 测试 // 先创建节点 heronode hero1 = new heronode(1, "宋江", "及时雨"); heronode hero4 = new heronode(4, "林冲", "豹子头"); heronode hero2 = new heronode(2, "卢俊义", "玉麒麟"); heronode hero3 = new heronode(3, "吴用", "智多星"); singlelinklist singlelinklist = new singlelinklist(); // singlelinklist.add(hero1); // singlelinklist.add(hero4); // singlelinklist.add(hero2); // singlelinklist.add(hero3); singlelinklist.addbyno(hero4); singlelinklist.addbyno(hero2); singlelinklist.addbyno(hero3); singlelinklist.addbyno(hero1); singlelinklist.addbyno(hero1); singlelinklist.update(hero5); System.out.println("下面为修改后的列表"); singlelinklist.show(); System.out.printf("下面为删除 %d后的列表",hero2.no); singlelinklist.delete(hero2); singlelinklist.show(); } }