数据结构:单链表

news2025/7/14 15:31:54

用(带头节点)单链表完成图书统计。节点结构包括书籍编号,书籍名以及对应作者。功能包括增加(尾插法和指定位置插入法)、删除、修改、查看。


一、定义节点结构

每一个节点都包括这些变量,构造器复杂将传入的数据赋值给类本身的变量。

    public static class BookNode{
        public int bookNumber;
        public String bookName;
        public String bookAuthor;
        public BookNode next;
        //构造器
        public BookNode(int no, String book, String author){
            bookNumber = no;
            bookName = book;
            bookAuthor = author;
        }
    }

二、定义一个SingleLinkList类

该类用于管理链表,因为使用的是带头节点的单链表,因此在定义类的时候就应该把头节点定义好并初始化。

    public static class SingleLinkList{
        private BookNode head = new BookNode(0," "," ");
        //......
    }

三、添加元素

(1)尾插法

入参为一个新建的节点,用temp找到temp.next为null,以为着已经到达了链表尾部。将新节点node赋值给temp.next即已经将新节点连接上链表尾部。

        //尾插法
        public void add1(BookNode node){
            BookNode temp = head;
            while(true){
                if(temp.next == null){
                    break;
                }
                temp = temp.next;
            }
            temp.next = node;
        }

测试结果:

 因为手动添加的顺序是1-3-2,用尾插法会默认将新节点放在尾部,所以最后输出的时候仍然保持着1-3-2的顺序。

(2)指定位置插入

制定位置插入是根据书本的编号来安排每个节点之间的关系。

何为合适的位置?就是在链表中找到某一个位置,上一个节点的书本编号小于新节点的书本编号,而下一个节点的书本编号又大于新节点的书本编号,这意味着该位置就是新节点的最佳位置。前一个节点就是为temp,而后一个节点就为temp2。若满足条件,则需要断开此处的聊表链接,将新节点插入,再完成链接。

如果寻至尾部,仍未找到满足条件的位置,则在链表最后插入即可。

        //中间插入
        public void add2(BookNode node) {
            BookNode temp = head;
            while (true) {
                if (temp.next == null) {
                    temp.next = node;
                    break;
                }
                if (node.bookNumber > temp.bookNumber) {
                    BookNode temp2 = temp.next;
                    if (node.bookNumber < temp2.bookNumber) {
                        BookNode temp3 = temp.next;
                        temp.next = node;
                        node.next = temp3;
                        break;
                    }
                }
                temp = temp.next;
            }
        }

测试结果:

 手动添加的顺序仍然是1-3-2,用制定位置插入法会按照图书标号将新节点放在编号所对应的位置,所以最后输出的顺序为1-2-3。

 

三、展示链表

首先判断链表是否为空,若为空则提示用户并直接return就可以了;若不为空,则用show遍历链表,并将链表中的数据打印出来即可。

        //展示链表
        public void list(){
            if(head.next == null){
                System.out.println("链表为空~没东西可看了......");
                return;
            }
            BookNode show = head.next;
            while(show != null){
                System.out.println("(" +show.bookNumber+ ")" +"《"+show.bookName+"》"+"作者:"+show.bookAuthor);
                show = show.next;
            }
        }

四、修改链表

传入一个新的节点,新节点的bookNumber应该与目标节点保持一致。通过对比新节点和目标节点号,寻找要修改的节点。用flag记录是否找到,如找到则将flag设为true,否则false。完成遍历后,根据flag值进行下一步操作。若为true,则意味着在链表中找到了目标节点,把链表中目标节点的数据更新为新节点的数据;若为false,意味着没有找到,则提示用户。

        //修改
        public void updata(BookNode bookdata){
            BookNode temp = head;
            boolean flag = false;
            while(true){
                if(temp.bookNumber == bookdata.bookNumber){
                    flag = true;
                    break;
                }
                temp = temp.next;
            }

            if(flag){
                temp.bookName = bookdata.bookName;
                temp.bookAuthor = bookdata.bookAuthor;
            }else{
                System.out.println("没有找到该元素~");
            }
        }

测试结果:

根据新节点的信息修改链表中节点的信息。将第二本图书,更改为无名氏写的《十万个为什么》,但序号不变。

 

五、删除节点

传入一个需要删除的编号,通过对比每个节点的bookNumber进行删除操作,同样用flag记录找寻结果。当找到需要删除的节点时,temp会指向需要删除的节点,而front则会指向需要删除节点的前一个节点。front变量的存在,就是为了方便删除操作,将front.next的值直接更改为temp.next值(意味着已经跳过temp节点),在java中temp节点则被视为弃用的节点会被自动回收。如果没有找到需要删除的节点,则提示用户。

        //删除
        public void del(int n){
            BookNode front = head;
            BookNode temp = head.next;
            Boolean flag = false;
            while (true){
                if(n == temp.bookNumber){
                    flag = true;
                    break;
                }
                temp = temp.next;
                front = front.next;
            }
            if(true){
                front.next = temp.next;
            }else{
                System.out.println("没有找到需要删除的数据......");
            }
        }

测试结果:

将第一本书鲁迅的《狂人日记》从链表中删除。最后输出仅剩两本书了。

 


全部代码:

import org.omg.Messaging.SyncScopeHelper;

public class LineList {

    public static void main(String[] args){
        //书籍数据
        BookNode test = new BookNode(1,"狂人日记","鲁迅");
        BookNode test2 = new BookNode(2,"社会性动物","E.阿伦森");
        BookNode test3 = new BookNode(3,"时间简史","史蒂芬.霍金");

        //创建一个单链表
        SingleLinkList testlist = new SingleLinkList();

        //添加
        //头插法
//        testlist.add1(test);
//        testlist.add1(test3);
//        testlist.add1(test2);
//        //指定位置插入
        testlist.add2(test);
        testlist.add2(test3);
        testlist.add2(test2);

//        //删除
        testlist.del(1);
//
//        //修改
        BookNode updata = new BookNode(2,"十万个为什么","无名氏");
        testlist.updata(updata);

        //展示链表
        testlist.list();
    }


    //节点
    public static class BookNode{
        public int bookNumber;
        public String bookName;
        public String bookAuthor;
        public BookNode next;
        //构造器
        public BookNode(int no, String book, String author){
            bookNumber = no;
            bookName = book;
            bookAuthor = author;
        }
    }

    //管理
    public static class SingleLinkList{
        private BookNode head = new BookNode(0," "," ");

        //尾插法
        public void add1(BookNode node){
            BookNode temp = head;
            while(true){
                if(temp.next == null){
                    break;
                }
                temp = temp.next;
            }
            temp.next = node;
        }

        //中间插入
        public void add2(BookNode node) {
            BookNode temp = head;
            while (true) {
                if (temp.next == null) {
                    temp.next = node;
                    break;
                }
                if (node.bookNumber > temp.bookNumber) {
                    BookNode temp2 = temp.next;
                    if (node.bookNumber < temp2.bookNumber) {
                        BookNode temp3 = temp.next;
                        temp.next = node;
                        node.next = temp3;
                        break;
                    }
                }
                temp = temp.next;
            }
        }

        //展示链表
        public void list(){
            if(head.next == null){
                System.out.println("链表为空~没东西可看了......");
                return;
            }
            BookNode show = head.next;
            while(show != null){
                System.out.println("(" +show.bookNumber+ ")" +"《"+show.bookName+"》"+"作者:"+show.bookAuthor);
                show = show.next;
            }
        }

        //修改
        public void updata(BookNode bookdata){
            BookNode temp = head;
            boolean flag = false;
            while(true){
                if(temp.bookNumber == bookdata.bookNumber){
                    flag = true;
                    break;
                }
                temp = temp.next;
            }

            if(flag){
                temp.bookName = bookdata.bookName;
                temp.bookAuthor = bookdata.bookAuthor;
            }else{
                System.out.println("没有找到该元素~");
            }
        }

        //删除
        public void del(int n){
            BookNode front = head;
            BookNode temp = head.next;
            Boolean flag = false;
            while (true){
                if(n == temp.bookNumber){
                    flag = true;
                    break;
                }
                temp = temp.next;
                front = front.next;
            }
            if(true){
                front.next = temp.next;
            }else{
                System.out.println("没有找到需要删除的数据......");
            }
        }
    }
}

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

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

相关文章

去除 Zotero + Obsidian 复制粘贴参考文献表时的多余空行(ctrl+shift+C)

前言 最近在用 Zotero 做文献管理&#xff0c;用 Obsidian 记笔记。但是使用的时候&#xff0c;有一个问题不大&#xff0c;但是有时候很烦人的情况&#xff1a;粘贴参考文献格式。在粘贴的时候总会莫名多出来几个空行&#xff0c;需要手动删除。 举个例子&#xff1a; 下面…

蚂蚁链牵头两项区块链国际标准在ITU成功立项

近日&#xff0c;国际电信联盟第十六研究组&#xff08;简称ITU-T SG16&#xff09;召开全体会议。会上&#xff0c;由蚂蚁链牵头的两项区块链国际标准获得立项通过。包括&#xff1a; ITU-T H.DLT-SCLMR “Smart contract lifecycle management requirements for distributed…

Arduino开发实例-PS/2键盘驱动

PS/2键盘驱动 1、PS/2通信协议介绍 物理 PS/2 端口是 6 针 DIN 连接器。 连接器引脚如下所示: Vcc/Ground 为设备提供电源 (5V),而 Data 和 Clock 是两条集电极开路线,带有上拉电阻到 Vcc。 电阻值并不重要(1 – 10 KOhm),最小值给出最短的上升时间,而较大的值允许更少…

AES简写

一、简介引入 密码学中的高级加密标准&#xff08;Advanced Encryption Standard&#xff0c;AES&#xff09;&#xff0c;又称Rijndael加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES&#xff08;Data Encryption Standard&#xff0…

kingdee漏洞存在多个安全漏洞(通用管理账号+获得数据库密码+远程代码执行)

kingdee漏洞详情,金蝶eas存在通用管理账号获得数据库密码漏洞&#xff0c;金蝶apusic存在远程代码执行漏洞。 下面的信息希望乌云在确认漏洞予以模糊处理&#xff0c;以免对厂商和用户产生不良影响&#xff1a; 漏洞一、金蝶eas系统存在一个默认的管理员账号admr&#xff0c;密…

vBox+K8s坑记录

vBoxKubernetesFlannelDashboard一、VBox虚拟机IP地址重复问题1、通过导入ova系统镜像2、复制同一个镜像导致IP重复&#xff0c;无法拉取镜像复制多个系统镜像后&#xff0c;修改IP地址curl无效&#xff08;注同时启动两个及以上&#xff0c;会出现该问题&#xff09;导致拉取镜…

JVM堆内存泄露分析

一、背景 公司有一个中间的系统A可以对接多个后端业务系统B&#xff0c;一个业务系统以一个Namespace代表, Namespace中包含多个FrameChannel(用holder保存)&#xff0c;表示A连接到业务系统B各服务实例的连接&#xff1b;A与B通过GRPC通信。 二、现象 测试使用一台服务实例A&…

立创EDA仿真入门2 实战全桥整流

立创EDA仿真入门2 实战全桥整流一、全桥整流原理二、操作步骤1. 在立创EDA新建仿真项目和原理图2. 绘制原理图电阻的作用函数发生器的设置3. 点仿真4. 使用电容代替电阻5. 加上负载一、全桥整流原理 全桥整流也称整流桥堆&#xff0c;使用4个或更多相同的二极管组成整流电路&am…

四、MySQL 提权方式

1 UDF 提权 secure_file_priv 是用来限制 load dumpfile、into outfile、load_file() 函数在哪个目录下拥有上传或者读取文件的权限 show global variables like secure%; 修改 my.cnf 文件,在 [mysqld] 块下,如果没有 secure_file_priv 则新增 指定目录:secure_file_pri…

[附源码]java毕业设计商城管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Oracle 11g安装使用、备份恢复并与SpringBoot集成

背景 最近接手了一个祖传项目&#xff0c;一个十几年前的 .Net 客户端项目&#xff0c;近期需要修改一个小功能&#xff0c;项目用到了 Oracle 数据库&#xff0c;以下是我在 Windows 7 旗舰版虚拟机上安装使用 Oracle 11g 的记录。 在 Windows 7 虚拟机上安装了 Oracle 服务…

招聘小程序开发功能点_分享招聘小程序的优势

招聘小程序的主要用户就是企业招聘端和找工作人员的用户端,下面从这两个端来对招聘小程序开发的功能进行介绍。 企业端功能 1、岗位发布:企业根据自身岗位需求,在招聘app上发布招聘岗位及所需技能。 2.简历筛选:根据求职者提交的简历选择合适的简历,并对公开发布的简历进行筛…

利用numpy库定义一个等比数列:logspace()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 创建等比数列 logspace()函数 选择题 关于以下代码下列说法错误的是? import numpy as np print("【执行】np.logspace(1,3,3,base2)") print(np.logspace(1,3,3,base2)) print…

物联网智能家居系统概述和相关技术

物联网的发展和形成方方面面涉及了很多相关的技术。随着物联网的逐渐成熟&#xff0c;物联网的分层体系也趋于统一&#xff0c;现阶段普遍接受一种三层结构的物联网&#xff0c;即由下至上依次为&#xff1a;感知层、网络层、应用层。 图1-1 物联网体系结构图 所以&#xff0c…

JAVA SpringMVC老项目集成knife4j

需求: 原有一直使用showdoc工具对内或对外进行接口文档和功能的沟通&#xff0c;上层领导觉得人工进行手写 浪费很多人工维护时间可能会做到接口更改而面对静态文档而更新不及时showdoc的劣势是不能进行在线调试 需要辅助其他调试工具但领导只需要类似swagger官方的页面即可。通…

开发前后端交互规范与请求封装

开发前后端交互规范与请求封装一&#xff0c;背景说明二&#xff0c;Axios请求封装三&#xff0c;数据对象封装1&#xff0c;前端封装2&#xff0c;后端封装四&#xff0c;总结五&#xff0c;Axios拦截器七&#xff0c;Restful请求1&#xff0c;Restful的由来2&#xff0c;Rest…

亲测好用的开发工具【1】 RuoYi-MT

亲测好用的开发工具【1】 文章目录亲测好用的开发工具【1】RuoYi-MT1 问题引入2 RuoYi-MT3 使用RuiYi-MTRuoYi-MT 1 问题引入 没错&#xff0c;又是若依&#xff0c;今天遇到一个需求&#xff0c;就是用若依打底&#xff0c;做一个自己的前后端分离的后台管理系统。 但是吧&…

电科大离散数学-1-集合论基础

目录 1.1 集合的初见 1.1.1 集合的定义 1.1.2 集合的表示方法 1.1.3 集合的基数 1.2 特殊集合与集合间关系 1.2.1 空集 1.2.2 全集 1.2.3 集合的相等关系 1.2.4 包含关系 1.2.5 幂集 1.3 集合的运算 1.3.1 并运算 1.3.2 交运算 1.3.3 补运算 1.3.4 差运算 1.3.…

使用VUE3.0版本搭建H5模板

使用VUE3.0版本搭建H5模板 仓库地址&#xff0c;有需要的可以参考参考 https://gitee.com/young_frivolous/vue3-app-template/tree/master为了方便每次写项目都要去搭建一个框架&#xff0c;今天使用vue3.0从0开始实行一个开箱即用移动端模板&#xff0c;基于vue3.0全家桶 v…

Windows安装和完全卸载MySQL8(以MySQL8.0.31版本为例) 之 Zip 方式(超详细教程)

文章目录一. 前言二. 安装1.下载MySQL2. 安装MySQL3.小结&#xff1a;4.修改环境变量3.完全卸载一. 前言 MySQL8相比之前版本改动还是挺大&#xff0c;主要有以下几点&#xff1a; MySQL8之后并不需要my.ini&#xff0c;会自动的生成data文件夹在解压之后的文件&#xff0c;端…