单链表的简单增删改查


/*
按序号添加
1,首先找到temp新添加的节点位置的前一个,是通过辅助变量(指针),通过遍历来搞定
2,新节点.next=temp.next
2 temp.next=新节点
 */
public class SingleLunkedListDemo {
    public static void main(String[] args) {
      //测试
        //创建节点
//      每一个HeroNode对象就是一个节点
        HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
        HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
        //创建链表
        SingleLunkedList singleLunkedList = new SingleLunkedList();
当不考虑编号顺序时这么添加
//        singleLunkedList.add(heroNode1);
//        singleLunkedList.add(heroNode2);
//        singleLunkedList.add(heroNode3);
//        singleLunkedList.add(heroNode4);
        //按编号顺序添加在内存中就可节省时间
        singleLunkedList.addByorder(heroNode1);
        singleLunkedList.addByorder(heroNode3);
        singleLunkedList.addByorder(heroNode2);
        singleLunkedList.addByorder(heroNode4);
//        singleLunkedList.addByorder(heroNode4);
        //显示
        singleLunkedList.list();
        //测试修改节点信息不能修改编号
        //首先先创建一个节点(也就是你要修改成哪样),编号是你要修改的哪个节点的编号
        HeroNode newherenode = new HeroNode(2, "小卢", "玉麒麟~~");
        singleLunkedList.update(newherenode);
        System.out.println("修改后显示~~~~~");
        //显示
        singleLunkedList.list();
        //删除节点
        singleLunkedList.delectnode(1);
        singleLunkedList.delectnode(4);
        singleLunkedList.delectnode(3);
        singleLunkedList.delectnode(2);
        System.out.println("删除后显示");
        //显示
        singleLunkedList.list();
    }
}
//定义SingleLunkedList 管理我们的英雄
class SingleLunkedList{
    //先初始化头节点不要动不存放具体数据
    private HeroNode head=new HeroNode(0,"","");
    //添加节点到单向链表
    //思路,当不考虑编号顺序时
    //1找到当前最后一个节点
    //2将最后一个节点的next指向新的节点
    public void add(HeroNode heroNode) {
       //头节点不能动所以需要一个辅助变量temp
       HeroNode temp=head;
       while (true){
           //找到链表最后
           if (temp.next==null){
               break;
           }
           //如果没有找到就将temp后移
           temp=temp.next;
       }
       //退出while则说明找到链表最后
        //将最后这个节点next指向新的节点
        temp.next=heroNode;
    }

    public void addByorder(HeroNode heroNode) {
        //头节点不能动所以需要一个辅助变量temp来找添加的位置
        //因为是单链表,也因为我们找的是temp是添加位置前面一个节点,否则添加不了
        HeroNode temp=head;
        boolean flag=false;//用来判断添加的编号是否存在,默认为false好提示
        while (true){
            if (temp.next==null){//说明找到链表的最后啦不管找没找到都break;
                break;
            }
            if (temp.next.no>heroNode.no){//位置找到了就在temp后面添加 temp.next.no是指原来链表找的temp的后一个节点
                //添加的数据位于temp.next.no与temp.no之间
                break;
            }else if (temp.next.no==heroNode.no){
                //说明这个编号已经存在就不可以在添加
                //然后循环停止
                flag=true;
                break;
            }
            temp=temp.next;//后移,遍历当家链表
        }
        //先判断flag的值
        if (flag){
            //说明编号已经存在不可以添加
            System.out.println("编号已经存在不可以添加"+heroNode.no);
        }else {
            heroNode.next=temp.next;
            temp.next=heroNode;//heroNode我认为是地址
        }
    }
    //修改节点的信息,根据no编号来修改,no编号不能改
    //newhernode 的no 来修改
    //newhernode//要修改的节点
    public void update(HeroNode newhernode){
        //判读是否为空
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp=head.next;
        boolean flag=false;//判读是否找到节点的标记
        while (true) {
            if (temp==null){
                //这里为什么是temp==null勒?因为temp等于空之后就说明已经遍历完了(这里不可能是head节点)
                break;//已经遍历完了
            }
            if (newhernode.no== temp.no){
                //找到
                flag=true;
                break;
            }
            temp=temp.next;
        }
        //有两种可能一种是遍历完没找到退出的二是找到了退出的
        if (flag){
            temp.name= newhernode.name;
            temp.nickname= newhernode.nickname;
        }else {
            //flag==false时说明没找的这个节点
            System.out.printf("没有找到这个节点编号 %d 的节点,不能修改",newhernode.no);
        }
    }
    //删除节点的思路
    //head节点不能动(temp辅助节点找到待删除的节点的前一个)
    //1首先先找到需要删除节点前一个节点temp
    //2 temp.next=temp.next.next
    //3被删除的节点将不会有其他的引用指向,会被回收机制(jvm)回收
    public void delectnode(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.printf("没有找到 %d 这个节点",no);
        }
    }
    //显示链表(遍历)

    public void list() {
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        //头节点不能动所以需要一个辅助变量temp
        HeroNode temp=head;//可以这样写HeroNode temp=head;
        while (temp!=null){
            System.out.println(temp);
            temp=temp.next;//temp后移
        }
        //遍历也可以这样写
//        while (true){
//            //判断是否到链表最后
//            if (temp==null){
//                break;
//            }
//            System.out.println(temp);
//            temp=temp.next;//temp后移
//        }
    }

}


//定义一个节点(HeroNode),每个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;
    }
    //为啦显示方便重写toString

    @Override
    public String toString() {
        return "HeroNode [no=" +no+ ", name=" +name + ",nickname=" + nickname+"]";
    }
}

这是我看韩顺平老师的课简单的整理的笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值