java单链表的增删查改

本文详细介绍了单链表的基本概念,包括节点结构和逻辑关系,展示了如何通过`add`、`orderAdd`、`delete`和`update`方法实现链表的增删改查。实例演示了Java中的`SingleLinkedList`类和`HeroNode`结构,适合初学者理解链表核心操作。
摘要由CSDN通过智能技术生成

单链表的概念

逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。

由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。
在这里插入图片描述

链表中数据元素的构成

节点由数据域和指针域构成
数据域存放数据,指针域存放地址
单链表分为带头结点和不带头节点链表,具体视情况而定

在这里插入图片描述

package SingleLinkedList;
class SingleLinkedList{
    //构造头节点
    private HeroNode head= new HeroNode(0,"","");

    //尾插法,添加节点
    public void add(HeroNode heroNode){
        //要一个临时变量辅助遍历
        HeroNode temp = head;
        //遍历列表,找到最后
        while (true){
            if (temp.next==null){
                break;
            }
            //如果没有找到,将temp往后移
            temp=temp.next;
        }
        //退出循环。temp指向链表最后
        //将最后节点的next指向新的节点
        temp.next = heroNode;
    }

    //中间插入
    public void oderAdd(HeroNode heroNode){
        //要一个临时变量辅助遍历
        HeroNode temp = head;
        boolean flag=false;
        //遍历列表,找到最后
        while (true){
            if (temp.next==null){//说明已经到链表最后
                break;
            }
            if (temp.next.no>heroNode.no){//位置找到就在temp的后买你
                 break;
            }
            else if(temp.next.no==heroNode.no){//说明希望添加的标号已经存在
                flag=true;

            }
            //如果没有找到,将temp往后移
            temp=temp.next;
        }
        if (flag){
            System.out.printf("准备的英雄编号%d已经存在,不能加入\n",heroNode.no);
        }else {
            heroNode.next=temp.next;//找到新节点的后继
            temp.next=heroNode;//找到新节点的前驱
        }
    }

    public void list(){
        //判断列表是否为空
        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 void delete(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不存在\n",no);
        }
    }

    //修改节点
    public void update(HeroNode newHeroNode){
        if (head.next==null){  //判断链表是否为空
            System.out.println("链表为空不修改");
            return;
        }
        //找到需要修改的节点,根据no修改
        HeroNode temp=head;
        Boolean flag=false;

        while (true){
            if (temp.next==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);
        }
    }

}
  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 + '\'' +
                '}';
    }

}
public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode heroNode1 = new HeroNode(1,"宋江","及时雨");
        HeroNode heroNode2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode heroNode3 = new HeroNode(3,"吴用","智多星");
        HeroNode heroNode4 = new HeroNode(4,"林冲","豹子头");

        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(heroNode1);
        singleLinkedList.add(heroNode2);
        singleLinkedList.add(heroNode3);
        singleLinkedList.add(heroNode4);
        singleLinkedList.list();

        System.out.println("按顺序添加");
        SingleLinkedList singleLinkedList2 = new SingleLinkedList();
        singleLinkedList2.oderAdd(heroNode1);
        singleLinkedList2.oderAdd(heroNode4);
        singleLinkedList2.oderAdd(heroNode3);
        singleLinkedList2.oderAdd(heroNode2);
        singleLinkedList2.list();

        System.out.println("删除后的节点");
        singleLinkedList2.delete(5);
        singleLinkedList2.list();


        System.out.println("修改后的节点");
        HeroNode newHeroNode = new HeroNode(1,"宋江","小时雨");
        singleLinkedList2.update(newHeroNode);
        singleLinkedList2.list();


    }


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值