java数据结构之单链表

本文详细介绍了带头结点单链表的基本操作,包括如何添加节点、按顺序添加节点、打印链表、修改节点信息以及删除节点。通过自定义的HeroNode类展示了节点结构,并提供了相应的操作方法,便于理解链表的数据结构和操作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      链表是以节点的方式存储的,每个节点包括date域和next域。date域用来记录数据,next域用来记录下一个节点的位置。今天我们来谈谈带头结点单链表的基本操作:

      首先我们定义一个节点。为方便输出,我们重写toString方法

class HeroNode{

    public int no; //表示编号

    public String name; //表示名字

    public String nickname; //表示昵称

    HeroNode next; //表示指向下一个节点

    //构造器

    public HeroNode(String name, String nickname, int no) {

        this.name = name;

        this.nickname = nickname;

        this.no = no;

    }

    @Override

    public String toString() {

        return "HeroNode{" +

                "no=" + no +

                ", name='" + name + '\'' +

                ", nickname='" + nickname + '\'' +

                '}';

    }

}

单链表的增加操作

public void add(HeroNode heroNode){

        //遍历链表找链表的末尾

        //将最后一个节点的next域指向新的节点

        //因为头节点不能动,因此我们需要一个辅助变量temp

        HeroNode temp = head; //对象之间的赋值,意味着head和temp操作的是同一块空间

        while(temp.next != null){

            temp = temp.next; //同上,temp与temp.next操作同一块空间

        }

        temp.next = heroNode; //temp.next指向heroNode的空间

    }

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YGH6Iul54ix5pyJ5aSp5oSP,size_18,color_FFFFFF,t_70,g_se,x_16

单链表的按顺序增加

//按照顺序来插入节点

    //如果添加失败就提示

    public void addByOrder(HeroNode heroNode){

        HeroNode temp = head;

        boolean flag = false;//用来标记节点是否已经存在

        //因为是单链表,必须找到需要插入位置的前一个位置

        while(true){

            if(temp.next == null){

                //说明temp已经在链表的最后

                break;

            }

            if(temp.next.no > heroNode.no){

                //位置找到,就在temp的后面

                break;

            }else if(temp.next.no == heroNode.no){

                //说明希望添加的节点已经存在

                flag = true;

                break;

            }

            temp = temp.next;//向后移,遍历

        }

        if(flag == true){

            System.out.printf("准备插入的英雄编号 %d 已经存在",heroNode.no);

        }else{

            heroNode.next = temp.next; //这里的顺序不能反

            temp.next = heroNode;

        }

    }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YGH6Iul54ix5pyJ5aSp5oSP,size_17,color_FFFFFF,t_70,g_se,x_16

 

单链表的打印操作

//显示链表(遍历)

    public void list(){

        //先判断链表是否为空

       if(head.next == null){

           System.out.println("链表为空");

           return;

       }

        //因为头节点不能动,因此我们需要一个辅助变量temp

       HeroNode temp = head;

       while(true){

           if(temp == null){

               break;

           }

           System.out.println(temp.toString());

           temp = temp.next;

       }

    }

单链表的修改操作

 //修改节点的信息,即编号不能改

    public void update(HeroNode newHeraNode){

        //判断是否为空

        if(head.next == null){

            System.out.println("链表为空");

            return;

        }

        //找到需要改变的节点,根据no编号

        HeroNode temp = head;

        boolean flag = false; //来表示是否找到该节点

        while(true){

            if(temp == null){

                break; //链表已经遍历结束

            }

            if(temp.no == newHeraNode.no){

                flag = true;

                break;

            }

            temp = temp.next;

        }

        if(flag){

            temp.name = newHeraNode.name;

            temp.nickname = newHeraNode.nickname;

        }else{

            System.out.println("找不到对应节点");

        }

    }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YGH6Iul54ix5pyJ5aSp5oSP,size_14,color_FFFFFF,t_70,g_se,x_16单链表的删除操作

 

 //删除节点

    public void delete(int n){

        if(head.next == null){

            System.out.println("链表为空,无法删除");

            return;

        }

 

        HeroNode temp = head;

        boolean flag = false;

        while(true){

            if(temp.next.no == n){

                flag = true;

                break;

            }

            if(temp.next == null){

                break;

            }

            temp = temp.next;

        }

        if(flag){

            temp.next = temp.next.next;

        }else{

            System.out.println("找不到对应信息");

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假若爱有天意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值