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();
}
}