单向链表的使用

该文章介绍了如何在Java中创建一个单向链表,并提供了在链表头部添加节点的完整代码。代码包括`HeadNode`类用于表示链表节点,以及`NodeLink`类用于链表操作,如头部添加、尾部添加、遍历、删除和获取数据个数等方法。
摘要由CSDN通过智能技术生成

单向链表

  • 如下图,data域是存放数据的,next域是存储下一个地址的指针,是链式存储的
  • head头指针指向的150的地址值,通过150的地址值找到了对应的数据,在找到110的地址值,这就是链式存储
  • 链表是以节点的方式来存储的,每个节点的data域是存储数据的,next域是指向下一个节点
  • 链表是分为带头节点的和不带头节点的,根据实际的需求来定
    在这里插入图片描述
  • 单向链表就是一个链子,用next去关联的下一个类,知道最后一个next为null,这个就是末尾
    在这里插入图片描述
    在这里插入图片描述

HeadNode

package com.rj.bd.NodeLinks;

/**
 * @author LXY
 * @desc
 * @time 2023--04--10--17:42
 */
public class HeadNode<T> {

    //存放数据的排名
    public Integer on;
    //存放的实体数据
    public T data;
    //存放的下一个的索引
    public HeadNode next;

    public HeadNode(Integer on, T data, HeadNode next) {
        this.on = on;
        this.data = data;
        this.next = next;
    }

    public HeadNode() {
    }

    public HeadNode(Integer on, T data) {
        this.on = on;
        this.data = data;
    }

    @Override
    public String toString() {
        return "HeadNode{" +
                "on=" + on +
                ", data=" + data +
                "}" ;
    }
}

NodeLink

 //头部信息
    HeadNode<T> head=new HeadNode<T>();

    //添加方法
    public  boolean add(int index ,T val){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        //循环取出列表最后一位
        while (true){
            if (temp.next==null){
                break;
            }
            //如果没取到最后一位,temp向后移动,在判断
            temp=temp.next;
        }
        //现在取到的temp是最后一位,将其赋值,就完成了尾部插入数据
        temp.next=new HeadNode(index,val);
        return  true;
    }


    //遍历方法
    public  void getlist(){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        while (temp.next!=null){
            System.out.println(temp.next.toString());
            //如果没取到最后一位,temp向后移动,在判断
            temp=temp.next;
        }

    }

在这里插入图片描述

1.1 头部添加

  • 上面代码的add()是尾部添加
  • 以下是尾部添加
    //添加到头部
    public  void addhead(int index ,T val){
        //将头部信息赋给temp临时变量temp存储的是原始的数据
        HeadNode temp=head;
        //判断是不是首行,首行的话直接赋值
        if (temp.next==null){
            temp.next=new HeadNode(index,val);
        }else {
            //实例化头部信息,接受刚刚传递的信息
            HeadNode headNode = new HeadNode(index, val);
            //headNode.next添加上原本的头部的next信息,赋值给哦新的headNode变量
            headNode.next=temp.next;
            //重新赋值给temp,这样第一个next就是刚刚插入的数据,完成了头部插入
            temp.next=headNode;
        }

    }

完整代码

  • 浅浅的封装了一下,不考虑安全优化的话,是可以使用的,写了几个实用的方法
package com.rj.bd.NodeLinks;

import lombok.SneakyThrows;

/**
 * @author LXY
 * @desc
 * @time 2023--04--10--17:39
 */
public class NodeLink<T> {

    //头部信息
    HeadNode<T> head=new HeadNode<T>();


    /**
     * 删除数据
     * @param index
     */
    @SneakyThrows
    public  void remove(int index ){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        HeadNode headNode = new HeadNode();
        HeadNode newHeadNode=headNode;
        //角标判断
        if (index>=size()){
            throw  new Exception("越界");
        }
        for (int i = 0; i <size() ; i++) {
            if (i==index){
                //后移,一直找到数据
                temp=temp.next;
                continue;
            }else {
                if (temp.next==null){
                    break;
                }else {
                    newHeadNode.next=new HeadNode(temp.next.on,temp.next.data);
                    newHeadNode=newHeadNode.next;
                }
                //后移,一直找到数据
                temp=temp.next;
            }
        }
        head=headNode;
    }


    /**
     * 获取数据个数
     * @return
     */
    public  Integer size(){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        int count =0;
        while (true){
            if (temp.next!=null){
                count++;
            }else {
                break;
            }
            temp=temp.next;
        }

        return  count;
    }


    /**
     * 通过下标查询数据
     * @param index  索引
     * @return
     */
    @SneakyThrows
    public  HeadNode get(int index){
        //将头部信息赋给temp临时变量
        HeadNode temp = head;
         HeadNode headNode = new HeadNode();
        //角标判断
        if (index>=size()){
            throw  new Exception("越界");
        }
        //循环到最后一个temp
        for (int i = 0; i <=index; i++) {
            temp=temp.next;
            //最后一个temp就是想要的数据
            if (i==index){
                //返回
                headNode.on=temp.on;
                headNode.data=temp.data;
            }
        }
        return headNode;
    }


    /**
     * 添加数据到尾部
     * @param index
     * @param val
     * @return
     */
    public  boolean add(int index ,T val){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        //循环取出列表最后一位
        while (true){
            if (temp.next==null){
                break;
            }
            //如果没取到最后一位,temp向后移动,在判断
            temp=temp.next;
        }
        //现在取到的temp是最后一位,将其赋值,就完成了尾部插入数据
        temp.next=new HeadNode(index,val);
        return  true;
    }

    /**
     *  添加数据到头部
     * @param index
     * @param val
     */
    public  void addhead(int index ,T val){
        //将头部信息赋给temp临时变量temp存储的是原始的数据
        HeadNode temp=head;
        //判断是不是首行,首行的话直接赋值
        if (temp.next==null){
            temp.next=new HeadNode(index,val);
        }else {
            //实例化头部信息,接受刚刚传递的信息
            HeadNode headNode = new HeadNode(index, val);
            //headNode.next添加上原本的头部的next信息,赋值给哦新的headNode变量
            headNode.next=temp.next;
            //重新赋值给temp,这样第一个next就是刚刚插入的数据,完成了头部插入
            temp.next=headNode;
        }

    }

    /**
     * 遍历全部数据输出
     */
    public  void getlist(){
        //将头部信息赋给temp临时变量
        HeadNode temp=head;
        while (temp.next!=null){
            System.out.println(temp.next.toString());
            //如果没取到最后一位,temp向后移动,在判断
            temp=temp.next;
        }

    }






}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值