当前位置: 首页 > news >正文

【数据结构与算法】单向链表

一、什么是链表

        链表由一系列节点组成,每个节点都包含一个 data 域(存放数据和一个 next 域(指向下一节点。链表中的节点可以按照任意顺序存放在内存中,它们之间并不连续。每个节点都记录了下一个节点的地址,这样可以通过遍历节点的方式遍历整个链表。链表有种类型,如单向链表双向链表循环链表等。

        这里主要了解单向列表的实现与使用。


二、在 Java 中实现链表

        首先,我们需要定义一个节点类假设其用于保存个人信息(id、name),其中 next 用于指向下一个节点Node)。其还有构造方法同时重写了 toString 方法(不输出 next 的信息)。

class Node {public int id;public String name;public Node next;//构造器public Node(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "Node{" +"id=" + id +", name='" + name +'}';}
}

        接着,我们初始化一个头结点,其不存储任何数据,用于表示单链表的头部

private Node head = new Node(0, "");

        想要向链表中添加节点,可以在 SingleLinkedList 类中定义一个 add 方法,其内通过辅助节点(next)遍历链表到尾部,再将要添加的节点添加到尾部。

public void add(Node node) {// 因为 head 节点不能动,所以需要一个辅助节点 tempNode temp = head;while (true){if (temp.next == null){break;}temp = temp.next;}temp.next = node;
}

        想要查看链表的所有数据,可以定义一个 list 方法,创建一个辅助节点遍历链表并在 next 时输出错误信息后停止遍历,不为空输出节点的内容。

public void list(){if (head.next == null) {System.out.println("链表为空");return;}Node temp = head.next;while(true){if (temp == null){break;}System.out.println(temp);temp = temp.next;}
}

最终效果如下所示


        而要是想要实现添加时的 id 顺序随机 ,但会在链表中排序后添加到对应位置的功能,我们可以创建一个排序添加的方法 addByOrder,通过比较加入的节点与链表中原有节点中的 id 的大小来添加到链表相应位置。

public void addByOrder(Node node){Node temp = head;boolean flag = false;while(true){if (temp.next == null){break;}if (temp.next.id > node.id){break;} else if (temp.next.id == node.id){flag = true;break;}temp = temp.next;}if (flag){System.out.println("准备插入的人的编号已经存在:" + node.id);} else {node.next = temp.next;temp.next = node;}
}

        方法中先声明了一个辅助节点 temp 和一个用于记录 id 是否已存在flag。其先遍历链表,如果 temp 的下一个节点为 null 则表示到达链表的尾部,直接退出循环;之后判断是否存在 id 新加入的节点id 之后的,如果有则退出循环,此时 temp 代表需要插入位置之前的节点处,而 temp.next 则代表需要插入位置之后的节点处。(如下图所示

        而循环外可以将 ① node 的 next 设为 temp 的next ② temp 的 next 设为 node。(如下图所示

        最后如果遍历到 id 相同的节点,则将 flag 设为 true 退出循环,并在循环外输出错误信息

最终效果如下所示


        其余的基础操作也是类似的想法去实现,如删除操作,也是传入 id 遍历链表找到相同的 id 后将其从链表中断开(temp.next = temp.next.next)。更新删除操作对应代码如下:

public void update(Node newNode){if (head.next == null){System.out.println("链表为空");return;}Node temp = head.next;boolean flag = false;while(true){if (temp == null){break;}if (temp.id == newNode.id){flag = true;break;}temp = temp.next;}if (flag){temp.name = newNode.name;} else {System.out.println("没有找到编号 " + newNode.id + " 的节点");}
}public void del(int id){Node temp = head;boolean flag = false;while (true){if (temp.next == null){break;}if (temp.next.id == id){flag = true;break;}temp = temp.next;}if (flag){temp.next = temp.next.next;} else {System.out.println("没有找到编号 " + id + " 的节点");}
}

(水)

【完】

相关文章:

【数据结构与算法】单向链表

一、什么是链表 链表由一系列节点组成,每个节点都包含一个 data 域(存放数据)和一个 next 域(指向下一节点)。链表中的节点可以按照任意顺序存放在内存中,它们之间并不连续。每个节点都记录了下一个节点的地…...

网络编程UDP—socket实现(C++)

网络编程UDP—socket实现 前言UDP客户端和服务端UDP使用场景UDP socket C代码示例服务端接收数据示例(bindrecvfrom 阻塞式接收信息):bind 绑定-监听 函数为什么一般都是监听所有网络接口呢?为什么需要用inet_addr进行转换&#x…...

系统思考—冰山模型

“卓越不是因机遇而生,而是智慧的选择与用心的承诺。”—— 亚里士多德 卓越,从来不是一次性行为,而是一种习惯。正如我们在日常辅导中常提醒自己:行为的背后,隐藏着选择的逻辑,而选择的根源,源…...

MySQL 中存储金额数据一般使用什么数据类型

在 MySQL 中存储金额数据时,应该谨慎选择数据类型,以确保数据的精度和安全性。以下是几种常用的数据类型及其适用性: DECIMAL 类型: 描述:DECIMAL 类型是专门为存储精确的小数而设计的。它可以指定小数点前后的数字位数…...

Excel中一次查询返回多列

使用Excel或wps的时候,有时候需要一次查询返回多列内容,这种情况可以选择多次vlookup或者多次xlookup,但是这种做法费时费力不说,效率还有些低下,特别是要查询的列数过多时。我放了3种查询方法,效果图&…...

Java中各种数组复制方式的效率对比

在 Java 中,数组复制是一个常见的操作,尤其是在处理动态数组(如 ArrayList)时。Java 提供了多种数组复制的方式,每种方式在性能和使用场景上都有所不同。以下是对几种主要数组复制方式的比较,包括 System.a…...

STM32 FLASHdb

FlashDB是一款超轻量级的嵌入式数据库,专注于为嵌入式产品提供数据存储方案。以下是对STM32 FlashDB的详细介绍: 一、主要特性 资源占用极低:FlashDB的内存占用几乎为0,非常适合资源有限的嵌入式系统。支持多分区、多实例&#…...

【漏洞复现】Struts2(CVE-2024-53677)任意文件上传逻辑绕过漏洞

文章目录 前言一、漏洞描述二、漏洞详情三、影响版本四、危害描述五、漏洞分析六、漏洞复现七、修复建议前言 Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设…...

图的最短路径(C++实现图【4】)

目录 1. 最短路径 1.1单源最短路径--Dijkstra算法 代码实现 1.2 单源最短路径--Bellman-Ford算法 代码实现 1.3 多源最短路径--Floyd-Warshall算法 代码实现 1. 最短路径 最短路径问题:从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径&…...

Pandas01

文章目录 内容简介1 常用数据分析三方库2 Jupyter notebook3 Series的创建3.1 通过Numpy的Ndarray 创建一个Series3.2 通过列表创建Series 4 Series的属性和方法4.1 常用属性4.2 常用方法4.3 布尔值列表筛选部分数据4.4 Series 的运算 5 DataFrame的创建通过字典创建通过列表[元…...

opencl 封装简单api

这是cl代码 kernel.c __kernel void add_one(__global float *output,__global float* pnum) {int xget_global_id(0);output[x]pnum[0]; } c代码 #include <CL/cl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include<st…...

超快速的路径优化IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解

IKD-SWOpt&#xff1a;SHIFT Planner 中增量 KD 树滑动窗口优化算法详解 今天本博主王婆卖瓜自卖自夸&#x1f604;&#xff0c;介绍自己paper中的算法&#xff0c;本算法已经持续开源中(部分关键内容)Github&#xff0c;之前很多读者朋友一直说要详细讲讲路径优化算法&#x…...

精读DeepSeek v3技术文档的心得感悟

最近宋大宝同学读完了DeepSeekv3的文档&#xff0c;心中颇多感慨&#xff0c;忍不住想在这里记录一下对这款“业界有望启示未来低精度训练走向”的开源大模型的观察与思考。DeepSeek v3的亮点绝不仅仅是“Float8”或“超长上下文”这么简单&#xff0c;而是贯穿了从数值精度、注…...

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…...

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档&#xff1a; chooseMessageFile 微信小程序读取文件&#xff0c;请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…...

【CSS in Depth 2 精译_098】17.3:CSS 动画延迟技术与填充模式设置 + 17.4:通过 CSS 动画传递意图的秘诀

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式 ✔️17.4 通过动画传递意图…...

Oracle考试多少分算通过?

OCP和OCM认证的考试及格分数并不是固定的&#xff0c;而是根据考试的难度和考生的整体表现来确定。对于OCP认证&#xff0c;考生需要全面掌握考试要求的知识和技能&#xff0c;并在考试中表现出色才有可能通过。而对于OCM认证&#xff0c;考生则需要在每个模块中都达到一定的水…...

在云服务器中编译IDF(ESP32库)

登录云服务器 使用gitee从github上导入仓库 地址GitHub - espressif/esp-idf: Espressif IoT Development Framework. Official development framework for Espressif SoCs. 然后在云服务器中创建目录~/esp 进入路径后使用git clone 下载项目 进入编程指南ESP-IDF 编程指南…...

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具&#xff0c;特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top&#xff0c;top 会显示一个实时更新的界面&#xff0c;其中包含系统的关键指标&am…...

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…...

ESP32按键状态机设计:工业级去抖与多事件识别

1. ESP32-Button 库深度解析&#xff1a;面向工业级人机交互的按键状态机设计与实现1.1 工程背景与设计动因在嵌入式系统开发中&#xff0c;按键处理看似简单&#xff0c;实则暗藏诸多工程陷阱。裸写digitalRead()配合delay()的“抖动延时法”在教学Demo中尚可接受&#xff0c;…...

保姆级教程:用ESP32-P4和ST7703屏打造24fps高清视频轮播器(附完整代码)

ESP32-P4与ST7703屏实战&#xff1a;24fps高清视频轮播系统全流程解析 当一块性能强劲的嵌入式开发板遇到高分辨率显示屏&#xff0c;会碰撞出怎样的火花&#xff1f;本文将带您从零构建一个基于ESP32-P4和ST7703屏幕的高清视频轮播系统&#xff0c;实现稳定的24fps播放效果。不…...

遥感影像处理避坑指南:为什么你的SHP裁剪总失败?ArcMap与ENVI协作全解析

遥感影像裁剪实战避坑手册&#xff1a;从坐标系校准到多工具协同 当你在深夜盯着屏幕上那个扭曲变形的裁剪结果时&#xff0c;是否曾怀疑过人生&#xff1f;遥感影像的矢量裁剪看似简单&#xff0c;实则暗藏玄机。本文将带你深入剖析那些教科书上不会告诉你的实战细节&#xff…...

频繁冲突?数据静默损坏?Obsidian + 坚果云插件打造工业级笔记同步与容灾方案

在个人知识管理&#xff08;PKM&#xff09;领域&#xff0c;有一条铁律&#xff1a;比“从未备份”更可怕的&#xff0c;是“错误的同步导致的静默覆盖”。 对于 Obsidian 重度用户而言&#xff0c;几千篇 Markdown 笔记是毕生心血。当你兴冲冲地在手机、iPad 和公司电脑之间…...

给客户发固件,别再傻傻传源码了!手把手教你用ESP32 Download Tool烧录PlatformIO生成的bin文件

专业级ESP32固件交付方案&#xff1a;从PlatformIO编译到客户安全烧录全流程 当我们需要将开发完成的ESP32固件交付给客户时&#xff0c;直接发送源代码往往不是最佳选择。这不仅涉及知识产权保护问题&#xff0c;还可能因为客户缺乏开发环境而导致沟通成本激增。本文将详细介绍…...

记一次攻防演练复盘(蓝队)

事件&#xff1a;某省大数据局主导的一次攻防演练中午时段遭受大量攻击。 告警信息&#xff08;TOP 5&#xff09;&#xff1a;[疑似目录穿越攻击URI] [漏洞攻击: Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)] [web路径遍历漏洞攻击-Linux环境] [XSS跨站脚本攻击U…...

PCIe 4.0 vs 内存总线:为什么你的NVMe SSD速度上不去?

PCIe 4.0与内存总线带宽博弈&#xff1a;揭开NVMe SSD性能瓶颈的真相 当你花大价钱购入一块标称读取速度7000MB/s的高端NVMe SSD&#xff0c;实际测试却发现速度只有标称值的一半时&#xff0c;这种落差感就像买了跑车却只能在市区堵车。问题往往不在SSD本身&#xff0c;而是隐…...

KRM库:Arduino嵌入式运动控制的安全映射与非阻塞调度

1. KRM库概述&#xff1a;面向嵌入式运动控制的Arduino实用工具集KRM&#xff08;Koval Robotics & Motion&#xff09;是一个专为Arduino平台设计的轻量级底层工具库&#xff0c;其核心定位并非通用算法封装&#xff0c;而是聚焦于机器人与机电控制系统开发中高频、重复、…...

Whisper-large-v3企业实操:金融电话录音合规审查自动化流水线

Whisper-large-v3企业实操&#xff1a;金融电话录音合规审查自动化流水线 作者&#xff1a;by113小贝 | 10年AI语音技术实战经验 1. 项目背景与价值 金融行业的电话录音合规审查一直是个让人头疼的问题。传统的人工审查方式效率低下&#xff0c;一个审查员每天最多处理几十通录…...

圆周率日:致敬科技先驱与创新成就

圆周率日&#xff08;Pi Day&#xff09; 是每年一度的数学常数π&#xff08;圆周率&#xff09;的庆祝活动&#xff0c;定于3月14日&#xff0c;因为3、1、4是π的前三个有效数字。圆周率日于1988年首次被庆祝&#xff0c;自那时起&#xff0c;庆祝活动通常包括吃馅饼或举办各…...