Java尚硅谷数据结构与算法学习记录(3)-单链表的应用实例(增删改查)

单向链表

定义HeroNode节点:

package com.lylicoo.linkedlist;
//每一个HeroNode对象就代表一个节点
public 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 + '\'' +
                '}';
    }
}

定义SingleLinkedList实现增删改查:

package com.lylicoo.linkedlist;
//定义SingleLinkedList 管理我们的英雄
public class SingleLinkedList {
//    初始化一个头节点 头节点不要动 不存放数据
   public HeroNode head=new HeroNode(0," "," ");
   //添加节点到单向链表  每次都将新英雄添加到单向链表的表尾

   // 第一种添加方式:不考虑编号问题
    public void add(HeroNode heroNode){

        //思路:1)找到当前链表的最后一个节点
        //2)将最后一个节点的next指向新加入的节点
        //因为head不能动 所以需要一个辅助变量temp
        HeroNode temp=head;
        while(true){
            //判断是否已经到了链表的最后
            if(temp.next==null){
                break;
            }
            temp=temp.next;//不为空则temp后移直至找到最后一个节点
        }//退出while时已经找到当前链表的最后一个节点
        temp.next=heroNode;//将最后一个节点的next指向新加入的节点

    }

    //第二种添加方式:考虑编号问题
    //按编号顺序插入  如果要插入英雄的编号在链表中已经存在 则输出提示信息
    public void addByOrder(HeroNode heroNode){
        //因为head不能动 所以需要一个辅助变量temp
        HeroNode temp=head;
        boolean flag=false;//定义flag来标识该编号是否存在 默认false
        while(true){
            if(temp.next==null){break;}//说明已到链表最后 退出
            if (temp.next.no>heroNode.no){
                break;//说明已找到要插入位置
            }else if (temp.next.no==heroNode.no){
                flag=true;
                break;//说明该编号已经在链表中存在
            }
            temp=temp.next;//后移 实现遍历
        }//while循环结束时 已找到要插入新节点的位置
        if (flag){
            System.out.printf("你要插入的英雄的编号%d已经存在,无法插入英雄\n!",heroNode.no);
        }else{//插入即可
            heroNode.next=temp.next;
            temp.next=heroNode;
        }
    }
    //修改节点   根据编号 修改
    public void upDate(HeroNode newHeroNode){
        if (head.next==null){
            System.out.println("链表为空");return;
        }
        //因为head不能动 所以需要一个辅助变量temp
        HeroNode temp=head.next;
        boolean flag=false;//定义flag来标识是否找到要修改的位置 默认false
        while(true){
            if (temp==null){break;}//说明已经遍历完
            if (temp.no==newHeroNode.no) {//找到要修改的位置
                flag = true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            temp.name=newHeroNode.name;
            temp.nickname=newHeroNode.nickname;
        }else{
            System.out.printf("没有找到 编号为%d的英雄 不能修改!",newHeroNode.no);
        }
    }

    //删除节点
    public void del(int no){
        //因为head不能动 所以需要一个辅助变量temp
        HeroNode temp=head;
        boolean flag=false;//定义flag来标识是否找到要删除的节点 默认false
        while(true){
            if (temp==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;
            }
            //不为空时 则遍历链表
            //因为head不能动 所以需要一个辅助变量temp
            HeroNode temp=head.next;//不为空说明至少存在一个节点 故设为head.next比较方便
            while(true) {
                //判断是否已经到了链表的最后
                if (temp==null){
                    break;
                }
                //输出节点信息
                System.out.println(temp);
                //注意一定要将temp后移才能实现遍历
                temp=temp.next;
            }
        /*HeroNode temp=head;
        while(true) {
            //判断是否已经到了链表的最后
            if (temp.next==null){
                break;
            }
            //输出节点信息
            System.out.println(temp.next);
            //注意一定要将temp后移才能实现遍历
            temp=temp.next;
        }*/
    }

}

测试类:

package com.lylicoo.linkedlist;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        //先创建节点
        HeroNode hero1=new HeroNode(1,"宋江","及时雨");
        HeroNode hero2=new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode hero3=new HeroNode(3,"吴用","智多星");
        HeroNode hero4=new HeroNode(4,"林冲","豹子头");
        //创建单向链表
        SingleLinkedList singleLinkedList=new SingleLinkedList();
        //加入
       /* singleLinkedList.add(hero1);
        singleLinkedList.add(hero2);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero4);*/

       //按照编号顺序加入
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero3);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero2);
        //singleLinkedList.addByOrder(hero2);
        //显示链表
        singleLinkedList.list();
        //修改链表
        //创建新的英雄节点
        HeroNode newHeroNode=new HeroNode(3,"小吴","智多星!");
        singleLinkedList.upDate(newHeroNode);
        System.out.println("修改后的链表:");
        singleLinkedList.list();

        //删除节点
        singleLinkedList.del(1);
        singleLinkedList.del(3);
        System.out.println("删除节点后的链表:");
        singleLinkedList.list();




    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值