单链表按顺序插入节点

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("插入的值重复了为%d\n",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();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值