[4] 实现无头单向非循环链表

news2024/9/29 21:31:57

目录

一、框架

二、实现各个方法

三、测试各个方法

四、源码


一、框架

一个单向链表的节点,有数值域和下一个节点的地址

我们可以设计一个链表类,在这个链表类设计一个节点内部类,这里设计成内部类的形式,因为链表是由节点组成的,所以可以设计成内部类

public class MySingleList {
    static class ListNode{//链表是由节点组成的,所以可以设计成内部类
        public int val;//数值域
        public  ListNode next;//存储下一个节点的地址
        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
}

二、实现各个方法

(1)手动创建链表

    public void createList(){ //手动创建链表
        ListNode listNode1 = new ListNode(12);
        ListNode listNode2 = new ListNode(23);
        ListNode listNode3 = new ListNode(34);
        ListNode listNode4 = new ListNode(45);
        ListNode listNode5 = new ListNode(56);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        head = listNode1;
    }

(2)得到单链表的长度

    public int size(){
        ListNode cur = head;
        int count = 0;
        while (cur != null){
            count++;
            cur = cur.next;
        }
        return count;
    }

(3)遍历链表

    //遍历链表
    public void display(){
        ListNode cur = head; //不用head去遍历,这样head就不会移动
        while (cur != null){
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

 (4)头插法

    //头插法
    public void addFirst(int data){
        ListNode node = new ListNode(data);
        //分析可知可以不用判断链表是否为空
//        if(head == null){
//            head = node;
//        }
        node.next = head;
        head = node;
    }

 (5)尾插法

    //尾插法
    //需要判断head是否为空,不然cur = head,然后cur.next = node,会发生空指针异常
    public void addLast(int data){
        ListNode node = new ListNode(data);
        if(head == null){
            head = node;
        }else {
            ListNode cur = head;
            while (cur.next != null){
                cur = cur.next;
            }
            cur.next = node;
        }
    }

  (6)任意一个位置插入,设第一个数据节点为0号下标

    //任意一个位置插入,设第一个数据节点为0号下标
    public void addIndex(int index,int data){
        ListNode node = new ListNode(data);
        if(index<0 || index>size()){
            return;
        }
        if(index == 0){
            addFirst(data);
        }
        if(index == size()){
            addLast(data);
        }
        ListNode cur = findNode(index);
        node.next = cur.next;
        cur.next = node;
    }
    private ListNode findNode(int index){
        int count = 0;
        ListNode cur = head;
        while (count != index-1){
            cur = cur.next;

            count++;
        }
        return cur;
    }

(7)查找关键字key是否在单链表中

    //查找关键字key是否在单链表中
    public boolean contains(int key){
        ListNode cur = head;
        while (cur != null){
            if(cur.val == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

(8)删除第一次出现关键字为key的节点

    //删除第一次出现关键字为key的节点
    public void remove(int key){
        ListNode cur = head;
        while (head == null){
            System.out.println("此时链表为空,不能进行删除");
            return;
        }
        if(head.val == key){
            //判断第一个节点是否为要删除的节点
            head = head.next;
            return;
        }
        while (cur.next != null){
            if(cur.next.val == key){
                cur.next = cur.next.next;
                return;
            }
            cur = cur.next;
        }
        if(cur.next == null){
            System.out.println("链表中不存在所要删除的节点");
            return;
        }

    }

(9)删除所有值为key的节点

 

 

//删除所有值为key的节点
    public void removeAllKey(int key){
        if(head==null){
            return;
        }
        ListNode prev = head;
        ListNode cur = head.next;
        while (cur != null){
            if(cur.val == key){
                prev.next = cur.next;
                cur = cur.next;
            }else {
                prev = cur;
                cur = cur.next;
            }
        }
        //因为上面的代码,会略过头节点,所以单独处理头节点
        if(head.val == key){
            head = head.next;
        }
    }

(10)清空链表所有的元素

//清空链表所有的元素
    public void clear() {
        //粗暴的做法
        //this.head = null;

        //一个一个置为空
        ListNode cur = head;
        ListNode curNext = null;
        while (cur != null){
            curNext = cur.next;
            cur.next = null;
            cur = curNext;
        }
        head = null;

    }

三、测试各个方法

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.createList();
        System.out.println("=====================");
        mySingleList.addFirst(1);
        mySingleList.display();
        System.out.println("=====================");
        mySingleList.addLast(45);
        mySingleList.display();
        System.out.println("=====================");
        boolean ret = mySingleList.contains(45);
        if(ret){
            System.out.println("存在这个数");
        }else {
            System.out.println("不存在这个数");
        }
        System.out.println("=====================");
        mySingleList.addIndex(2,166);
        mySingleList.display();
        System.out.println("=====================");
        mySingleList.remove(2);
        mySingleList.display();
        System.out.println("=====================");
        mySingleList.removeAllKey(45);
        mySingleList.display();
        System.out.println("=====================");
        mySingleList.clear();
        mySingleList.display();

    }

 

 

四、源码

_20230411/src · benxiangsj/java learning - 码云 - 开源中国 (gitee.com)icon-default.png?t=N2N8https://gitee.com/benxiangsj/java-learning/tree/22866b8267171ace6977145ab6dee23b4f3769ef/_20230411/src

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《论文阅读》SetGNER:General Named Entity Recognition as Entity Set Generation

0.总结 不知道是不是大模型的流行还是什么其他原因&#xff0c;导致现在网上都没有人来分享NER模型的相关论文了~本文方法简单&#xff0c;代码应该也比较简单&#xff08;但是没见作者放出来&#xff09;。推荐指数&#xff1a;★★☆☆☆ 1. 动机 处理三种不同场景的NER 与…

python笔记:datetime

处理日期和时间 1 常量 MINYEAR datetime允许的最小年份 MAXYEAR datetime允许的最大年份 2 数据类型 datetime.date带有属性year,month,daydatetime.time带有属性hour,minute,second,microsecond,tzinfodatetime.datetime带有属性year,month,day,hour,minute,second,m…

【网络安全】文件包含漏洞

文件包含漏洞文件包含漏洞原理文件包含漏洞经常出现的函数尝试查看etc/passwd敏感文件渗透过程上传phpinfo和webshell到服务器并使用工具连接其他方式包含日志文件getshell包含环境变量getshell文件包含漏洞原理 文件包含漏洞是指&#xff0c;程序开发人员一般会把重复使用的函…

【C语言学习4——整型数据类型】

C语言学习4——整型数据类型整型数据类型用sizeof关键词来测量大小三位二进制表示的数值范围数值的补码表示法各种整型类型的数值范围是多少无符号整型整型数据类型 在上一节当中&#xff0c;我们遇到了用int关键词&#xff08;整数integer的缩写&#xff09;来表示一个整数的…

Python Qt5 入门教程

Python Qt5 入门教程 Python Qt5是一个强大的GUI工具包&#xff0c;可以用来设计各种桌面应用程序&#xff0c;包括图形用户界面、数据库应用程序等。本教程将带你入门Python Qt5&#xff0c;从安装开始到图形界面的设计以及常见的控件和事件。 安装 Python Qt5需要使用PyQt5…

好用的便签APP排行榜前十名?

我是一名时间管理与自律达人&#xff0c;而便签应用程序就是必备与理想的时间管理工具。经过自己长期的总结认为好用的电脑手机云便签APP应用程序应该具备以下功能。 1、多设备同步&#xff1a;可以方便地将电脑和手机之间的数据同步&#xff0c;随时随地管理便签内容。 2、分…

海思部署分类模型

1、原始模型 onnx转caffe报错没有globalaverage层。 于是转化成&#xff1a; onnx转化caffe之后&#xff0c;修改prototxt文件&#xff0c;加上globalaverage和reshape层. 参考&#xff1a;https://blog.csdn.net/z649431508/article/details/113425275 layer { name: “Glob…

PPO算法-理论篇

1. Policy Gradient 【李宏毅深度强化学习笔记】1、策略梯度方法&#xff08;Policy Gradient&#xff09; 李宏毅深度强化学习-B站 2. PPO PPO 算法 PPO算法更新过程如下&#xff1a; 初始化policy参数θ0\theta^0θ0在每一步迭代中&#xff1a; 使用θk\theta^kθk与环境…

架构师:不想当架构师的程序员不是好程序员

引言 不想当将军的士兵不是好士兵。 很多程序员的梦想&#xff0c;就是将来能成为一名架构师。 包括我刚学编程那时候&#xff0c;也是以当架构师为目标&#xff0c;觉得不想当架构师的程序员不是好程序员&#xff0c;希望将来能成为一个优秀的架构师。就像拿破仑那句名言&am…

进程调度算法(操作系统)

1、 前置知识 1.1 非抢占式与抢占式 1.1.1 非抢占式 非抢占式指的是一个线程的在执行期间&#xff0c;另一个线程的到达&#xff0c;尽管各项标准都优于执行线程&#xff08;例如优先级高于当前执行线程&#xff09;&#xff0c;也不会抢占CPU资源&#xff0c;会耐心的等待该…

【matlab程序】海图坐标轴单位的唯一

【matlab程序】海图坐标轴单位的唯一 【matlab程序】海图坐标轴单位的唯一 本文写作来源&#xff0c;从实际出发&#xff0c;用于实际&#xff1a; 热带海洋学报&#xff0c;投稿须知&#xff1a; 其中一条关于海图制作规范中&#xff1a; 经度标识&#xff08;E, W&#…

真题详解(0/1背包)-软件设计(四十九)

真题详解(线性表)-软件设计&#xff08;四十八)https://blog.csdn.net/ke1ying/article/details/130119249 多态有四种类型&#xff1a; 参数多态&#xff1a;应用比较广泛的多态&#xff0c;称为最纯多态。 包含多态&#xff1a;最常见的就是子类型化。 过载多态&#xff1…

Nfinity: YouTube创作者如何通过SocialFi变现

Nfinity推出了一个具有革命性的SocialFi平台&#xff1a;该平台通过生成NFT来帮助YouTube创作者实现内容变现。 YouTube做为全球第一大视频内容平台&#xff0c;尽管通过付费会员和广告收入的分成&#xff0c;为创作者们提供了大量的盈利机会&#xff0c;但它也存在很多的局限性…

【MybatisPlus快速入门】—— 基础入门

入门篇 我们先简单回顾一下 Mybatis 的用法&#xff0c;再引出MybatisPlus 1.1 Mybatis 框架回顾 &#x1f314; 1、什么是Mybatis框架呢&#xff1f; 一个持久层框架&#xff0c;目的是简化持久层的开发我们就使用springboot整合Mybatis&#xff0c;实现Mybatis框架的搭建…

NBT - 生成式蛋白设计,AI带来的蛋白质工程飞跃

科学家们创建了一个能够从头合成人工酶的人工智能系统。实验测试发现&#xff0c;一些酶与自然界中发现的酶具有相同的功效&#xff0c;即使人工生成的氨基酸序列与任何已知的天然蛋白质明显不同。实验表明&#xff0c;尽管自然语言处理是为了阅读和编写语言文本而开发的&#…

蓝牙技术|安卓将支持超宽带语音,蓝牙通话更清晰

Android 的蓝牙通话即将迎来质的飞跃&#xff0c;超宽带语音技术将让你的声音更清晰、更真实。 Android 专家 Mishaal Rahman 发现&#xff0c;Android 开源项目仓库中最近添加了一个补丁&#xff0c;实现了与蓝牙免提配置文件 v1.9 相关的功能。据IT之家了解&#xff0c;这个…

【初识C++】(关键字,命名空间)

文章目录一、C中的关键字二、命名空间1.命名空间规则展开命名空间域 和 #include 的区别2.正确使用命名空间三、C中的输入和输出一、C中的关键字 二、命名空间 命名空间是对于全局变量来说&#xff0c;我们在定义变量或函数时&#xff0c;函数名可能会和库中的函数名产生冲突。…

window 和 linux 安装 Tesseract-OCR

一、 Window 安装 Tesseract-OCR 1.安装 tesseract-ocr-w64-setup-5.3.1.20230401.exe 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 配置 PATH 环境变量 3. 配置TESSDATA_PREFIX 环境变量 4. 在 cmd 中查询是否安装成功 5. 在安装的目录 tessda…

算法刷题总结 (七) 双指针

算法总结7 双指针一、双指针的概念1.1、什么是双指针&#xff1f;1.2、常见类型1.2.1、快慢指针1.2.2、左右端点指针1.2.3、区间指针 - 滑动窗口汇总二、经典例题2.1、快慢指针&#xff08;1&#xff09;、链表判环141. 环形链表142. 环形链表 II287. 寻找重复数876. 链表的中间…

人工智能学习07--pytorch15(前接pytorch10)--目标检测:FPN结构详解

FPN&#xff1a;用于目标检测的特征金字塔网络 backbone:骨干网络&#xff0c;例如cnn的一系列。&#xff08;特征提取&#xff09; (a)特征图像金字塔 检测不同尺寸目标。 首先将图片缩放到不同尺度&#xff0c;针对每个尺度图片都一次通过算法进行预测。 但是这样一来&#…