超详细!java实现链表

2023-05-16

Node<T>结点类

public class Node<T>{
    //结点类
    /*
    数据域:data
    存取域:next
     */

    public T data;//数据域
    public Node<T> next;//地址域  这里是装的是下一个结点的地址,所以类型是结点类型

    //有参构造
    public Node(T data, Node<T> next){
        this.data = data;
        this.next = next;
    }

    //无参构造,手动调用有参构造赋空值
    public Node(){
        this(null,null);
     }

    @Override
    public String toString() {
        return this.data.toString();
    }
}

SinglyList<T>类

public class SinglyList<T> {
    /*
      单链表要要实现的功能:是否为空、清空、增、删、改、查、链表长度
     */
        public Node<T> head;//声明头结点
        public Node<T> rear;//声明尾结点

        private int count;//计算结点的长度

    //无参构造方法
    public SinglyList(){
        this.head = new Node<T>();
       //System.out.println("head赋值前:"+head.next);
    }

    public SinglyList(T [] values){
        this();//调用无参构造,创建空头节点
        rear = this.head;//最初,头指针和尾指针指向位置相同
       // System.out.println("read赋值前:"+rear.next);
        for (int i = 0; i < values.length; i++) {
            if(values[i] != null){
                rear.next = new Node<T>(values[i],null);
                rear = rear.next;
                this.count++;
            }

        }

//        System.out.println("head赋值后:"+head.next);
//        System.out.println("rear赋值后:"+rear.next);


    }

    /*
    public boolean isEmpty()
    return:为空返回真,不为空返回假
     */
    public boolean isEmpty(){
        if(this.head == null ){
            return true;
        }
        return false;
    }

    /*
    public void clear()
    将头节点和尾结点置空
     */
    public void clear(){
        this.head.data = null;
        this.head.next = null;
        this.rear.data = null;
        this.rear.next = null;
    }

    /*
    public Node<T> insert(int location,T e)
    插入元素
    location:要插入的位置
    e:要插入的元素
    return:你要插入新节点的地址
     */
   public Node<T> insert(int location,T e){

       //location小于 0 则插到头节点的后边
       //location大于count 则插到尾结点
       //提高了容错率


       Node<T> p = this.head;
        if( e == null ){
            return null;
        }
        for(int j = 0; p.next != null && j <location;j++){p = p.next;}

        /*
        这里很重要
        new Node<T>(e,p.next);  这是将要插入的元素,生成一个新结点
        Node<T>(e,p.next) 这里的p.next 是你要插入的位置,本来的元素的地址
        也就是说,你把你要插入那个位置原本的元素的地址,作为自己的next,你这个新
        结点就连接上了你要插入那个位置原本的元素以及后边的元素

        p.next = new Node<T>(e,p.next); 这里被赋值的p.next
        就是你要插入那个位置原本的元素前一个元素
        这里你就把你要插入的结点的地址,放到了它next里边
         */
        p.next = new Node<T>(e,p.next);

        return p.next;
   }

   /*
    public T delete(T e)
    删除链表中的指定元素
    e:要删除的元素
    return:返回要删除的元素
    */
    public T delete(T e){
       Node<T> p = this.head;

       //如果要删除的元素为空,则返回空
       if(e == null){
           return null;
       }

       //寻找元素
        // 如果找到了元素,我们要将e的next交给它的前一个元素的next
       while(p.next.data != e){p = p.next;} //这里我们找的e的前一个结点
        p.next = p.next.next;
        this.count--;//还得链表数量减去一个

       return e;
    }

    /*
    public T set(int index,T e)
    index:要修改元素的索引
    e:要替换元素的值
    return:被修改之前元素的值
     */
    public T set(int index,T e){
        //保证在有效的范围之内
        if(index >= 0&& index <= this.count){
            Node<T> p = this.head;
            //找到的是第i - 1个元素
            for (int i = 0; i < index && p!=null; i++) {
                p = p.next;
            }
            T previousElement = p.next.data;//保存要删除前的元素
            p.next.data = e;

            return previousElement;//返回被替代之前的元素
        }

        return null;
    }


    /*
    public Node<T> search(T key)
    寻找元素
    key:要找的元素
    return:返回找到元素的地址,没找到就返回Null
     */
    public Node<T> search(T key){
        Node<T> p = this.head;
        for (int i = 0; i < this.count; i++) {
            if(p.data == key){
                return  p;
            }
            p = p.next;
        }
        return null;

    }


    @Override
    public String toString() {
        String str = this.getClass().getName() + "(";
        Node<T> p = this.head.next;
        for (int i = 0; i < this.count; i++) {
            if(p !=null){
                str += p.data;
            }
           if(p.next != null){
               p = p.next;
           }
        }
        return  str +")";
    }
}

Test测试类

public class Test {
    public static void main(String[] args) {
        String []str = {"a","b","c","d","e","f","g","h"};
        SinglyList<String> singlyList = new SinglyList<String>(str);
        System.out.println(singlyList.toString());
        Node p = singlyList.search("g");
        System.out.println(p.data);

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超详细!java实现链表 的相关文章

随机推荐

  • 超详细的操作符讲解

    操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 1 算术操作符 span class token operator 43 span span class token o
  • Ubuntu 安装中文输入法

    请注意命令中不应该的空格可能导致命令不合法 xff01 一 检查 fcitx 框架 首先 xff0c 要安装中文输入法 xff0c 必须要保证系统上有 fcitx fcitx是一个以 GPL 方式发布的输入法框架 xff0c 安装 fcit
  • 快速幂取模简单用法

    关于快速幂的用法本小白还是思索了挺久的 xff08 因为我不太聪明哈 xff09 xff0c 但是学会了就觉得挺好理解的 下面我用一道例题来简单讲一下它的用法 xff0c 希望能帮你轻松get到 xff01 xff01 例题 xff1a 快
  • robomaster视觉规则细谈

    目录 攻击与检测 弹丸参数 增益点增益 升级效果 击打检测 涂装要求 裁判系统 机器人端各模块 赛事引擎各部分 客户端 服务器 能量机关 小能量机关 大能量机关 算法归纳 攻击与检测 弹丸参数 如图所示 xff0c 赛场中我们使用的弹丸有两
  • 关于如何用python下载文件

    先贴上源代码 xff1a GitHub zhangbaji PythonDownloader 这是一个Python下载http文件的事例 xff0c 只不过目前还无法获取动态文件的文件名 https github com zhangbaji
  • Java打印杨辉三角形

    span class token keyword public span span class token keyword class span span class token class name Taks02 span span cl
  • 第二章 利用ffmpeg把rgb转mp4

    本文章介绍ffmpeg基本使用流程 1 创建编码器 通过枚举id选择编码器类型 AVCodec avcodec find encoder enum AVCodecID id enum AVCodecID id 通过枚举选择编码器类型 AV
  • 栈的相关题目以及出栈时的规律

    今天做了两个有关栈的题目 xff0c 都可以用到出栈时的规律来解题 那么问题来了 xff0c 出栈时的规律是什么呢 xff1f 规律如下 xff1a 已知栈的输入序列是1 2 3 n xff0c 输出序列是a1 a2 ai an 然后我们任
  • Python 中 jieba 库

    文章目录 jieba库一 简介1 是什么2 安装 二 基本使用1 三种模式2 使用语法2 1 对词组的基本操作2 2 关键字提取2 3 词性标注2 4 返回词语在原文的起止位置 jieba库 一 简介 1 是什么 xff08 1 xff09
  • 【栈与队列】之栈的顺序存储(图文详细介绍!!)

    前言 xff1a 本章基于 大话数据结构 和王卓老师的视频内容 xff0c 为刚接触数据结构的初学者提供一些帮助 x1f495 如果我的文章对你有帮助 xff0c 点赞 收藏 留言都是对我最大的动力 目录 4 1 栈的定义 4 2 栈的抽象
  • 【C语言技能树】程序环境和预处理

    Halo xff0c 这里是Ppeua 平时主要更新C语言 xff0c C 43 43 xff0c 数据结构算法 感兴趣就关注我吧 xff01 你定不会失望 x1f308 个人主页 xff1a 主页链接 x1f308 算法专栏 xff1a
  • Java中输出所有的水仙花数

    问题描述 打印出所有的 水仙花数 xff0c 所谓 水仙花数 是指一个三位数 xff0c 其各位数字立方和等于该数本身 例如 xff1a 153是一个 水仙花数 xff0c 因为153 61 1的三次方 43 5的三次方 43 3的三次方
  • pip3 设置阿里云

    pip3 install r requirements txt 报超时 xff0c 于是设置阿里云作为安装源 xff1a pip3 config set global index url http mirrors aliyun com py
  • 输入一个数组,将其逆序输出

    今天参加了校内的计算机技能大赛 xff0c 找到了一道较为简单的题 xff0c 就是 将数组逆序输出 下面我将详细讲解一下代码思路 xff0c 好了 xff0c 老规矩 xff0c 先上代码 xff01 include lt bits st
  • 虚拟机中Ubuntu安装了anaconda3无法使用conda

    ubuntu 中安装了 anaconda3 但是无法 使用 conda 只会出现这句话 conda 未找到指令 我找了一些办法 xff0c 有一个有用的 xff1a 8条消息 Ubuntu下使用Anaconda3 出现conda 未找到命令
  • ubuntu配置nfs时Failed to start nfs-server.service: Unit nfs-server.service not found.

    在ubuntu系统中配置nfs时出现Failed to start nfs server service Unit nfs server service not found 原因 xff1a 新装的ubuntu系统并未安装nfs 应使用su
  • 【经验分享】使用Keil5烧录代码遇到的问题及解决方法

    目录 一 前言 二 所遇问题及解决方法 1 首先最基本的Options for target 编辑的设置不用多说 xff0c 下载器根据自己所使用的类型进行选择 我使用的是CMSIS DAP 2 第二种可能出现的问题如下 SWD JTAG
  • c++ delete与析构函数的注意点

    问题 xff1a 我们都知道析构函数在类对象作用域结束时自动调用 xff0c 但这个规则适合基本类型 xff0c 但不适合delete函数 原因 xff1a 如果对象是new运算符动态创建的 xff0c 如果最后没有调用delete xff
  • 超详细!JAVA实现顺序表类

    Seqlist类 增 删 改 查 xff0c 判断是否为空 public class Seqlist lt T gt protected int n 顺序表元素个数 protected Object element 顺序表元素 public
  • 超详细!java实现链表

    Node lt T gt 结点类 public class Node lt T gt 结点类 数据域 xff1a data 存取域 xff1a next public T data 数据域 public Node lt T gt next