模拟实现单链表 —— SingleLinkedList

模拟实现 java 中单链表的实现,方便后续对 java 中的 LInkedList 进行理解。

MySingleList类:

public class MySingleList {/*** 定义节点类*/static class ListNode {// 节点值private int val; // 下一个节点的引用private ListNode next; public ListNode(int val) {this.val = val;}}// 头节点private ListNode head;/*** 头插法*/public void headInsert(int value) {// 申请节点ListNode node = new ListNode(value);// 头插node.next = head;head = node;}/*** 尾插法*/public void tailInsert(int value) {// 申请节点ListNode node = new ListNode(value);// head 为空if (head == null) {// head 直接指向 nodehead = node;return;}ListNode cur = head;// 找最后一个节点while (cur.next != null) {cur = cur.next;}cur.next = node;}/*** 任意位置插入*/public void randomInsert(int index, int value) {// 判断下标是否合理judge(index);// 判断是否是头插或尾插if (isInsert(index, value)) {return;}// 中间位置插入ListNode cur = head;// 找到插入位置的前一个位置for (int i = 0; i < index - 1; i++) {cur = cur.next;}// 插入ListNode node = new ListNode(value);node.next = cur.next;cur.next = node;}/*** 判断下标是否合理*/private void judge(int index) {if (index < 0 || index > size()) {throw new IndexOFBoundException("下标: " + index + "错误!");}}/*** 判断插入位置是否是头插或尾插*/private boolean isInsert(int index, int value) {if (index == 0) { // 头插headInsert(value);return true;} else if (index == size()) { // 尾插tailInsert(value);return true;} else {return false;}}/*** 查找 value 是否在链表中存在*/public boolean contains(int value) {ListNode cur = head;while (cur != null) {if (cur.val == value) {return true;}cur = cur.next;}return false;}/*** 删除链表中第一次出现 value 的节点*/public void remove(int value) {// head 为空或要删除的节点是 headif (isNullOrHead(value)) {return;}// 获取要删除节点的前一个节点ListNode preNode = findFirstDeletePreNode(value);// 判断 preNode 为空if (preNode == null) {System.out.println("没有这个元素对应的节点");return;}// 删除节点ListNode delNode = preNode.next;preNode.next = delNode.next;}/*** 要删除的节点为空或是第一个节点*/private boolean isNullOrHead(int value) {if (head == null) { // head 为空return true;} else if (head.val == value) { // head 的 val 和 value 相同// head 后移head = head.next;return true;} else {return false;}}/*** 查找要删除 value 节点*/private ListNode findFirstDeletePreNode(int value) {ListNode cur = head;while (cur.next != null) {// 找到了要删除节点的前驱if (cur.next.val == value) {return cur;}cur = cur.next;}// 没找到return null;}/*** 删除所有值为 value 的节点*/public void removeAllValue(int value) {// 判空if (head == null) return;ListNode prev = head;ListNode cur = head.next;while (cur != null) {// 判断 cur.val 是否和 value 相等if (cur.val == value) {// 相等则让 prev.next 指向 cur.nextprev.next = cur.next;} else {// prev 移动到 cur 的位置prev = cur;}// cur 移动到 cur.nextcur = cur.next;}// 判断第一个节点的值是否和 value 相等if (head.val == value) {head = head.next;}}/*** 获取单链表的长度*/public int size() {ListNode cur = head;int count = 0;while (cur != null) {count++;cur = cur.next;}return count;}/*** 清空单链表*/public void clear() {// 把 head 置为 nullthis.head = null;}/*** 打印数组中的元素*/public void display() {ListNode cur = head;while (cur != null) {System.out.print(cur.val + " ");// 指向下一个值cur = cur.next;}System.out.println();}
}

IndexOFBoundException类:

public class IndexOFBoundException extends RuntimeException {public IndexOFBoundException() {}public IndexOFBoundException(String message) {super(message);}
}

Test类

public class Test {public static void main(String[] args) {MySingleList mySingleList = new MySingleList();/*mySingleList.headInsert(1);mySingleList.headInsert(2);mySingleList.headInsert(3);*///mySingleList.display();mySingleList.tailInsert(1);mySingleList.tailInsert(2);mySingleList.tailInsert(3);mySingleList.tailInsert(4);mySingleList.tailInsert(5);mySingleList.tailInsert(6);mySingleList.display();mySingleList.randomInsert(0, 111);mySingleList.randomInsert(7, 111);mySingleList.randomInsert(3, 111);//mySingleList.randomInsert(12, 111);mySingleList.display();mySingleList.remove(2);mySingleList.display();mySingleList.removeAllValue(111);mySingleList.display();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…

python学opencv|读取视频(一)灰度视频制作和保存

【1】引言 上一次课学习了用opencv读取图像&#xff0c;掌握了三个函数&#xff1a;cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下&#xff1a; python学opencv|读取图像-CSDN博客 这次课我们继续&#xff0c;来学习用opencv读取视频。 【2】学习资源 首先是官网…

第六届金盾信安杯Web题解

比赛一共4道Web题,比赛时只做出三道,那道文件上传没有做出来,所以这里是另外三道题的WP 分别是 fillllll_put hoverfly ssrf fillllll_put 涉及: 绕过exit() 死亡函数 php://filter 伪协议配合base64加解密 一句话木马 题目源码&#xff1a; $content参数在开头被…

机器学习概述,特征工程简述2.1——2.3

机器学习概述&#xff1a; 1.1人工智能概述 达特茅斯会议—人工智能的起点 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 1.1.2 机器学习和深度学习能做什么 传统预测 图像识别 自然语言处理 1.2什么是机器学习 数据 模型 预测 从历史数…

嵌入式蓝桥杯学习1 点亮LED

cubemx配置 1.新建一个STM32G431RBT6文件 2.在System-Core中点击SYS&#xff0c;找到Debug&#xff08;设置为Serial Wire&#xff09; 3.在System-Core中点击RCC&#xff0c;找到High Speed Clock(设置为Crystal/Ceramic Resonator) 4.打开Clock Configuration &#xff0…

【MySql】navicat连接报2013错误

navicat连接mysql报2013错误 报错信息1、检验Mysql数据库是否安装成功2、对Mysql的配置文件进行修改配置2.1、找到配置文件2.2、Linux下修改配置文本 3、连接进入mysql服务4、在mysql下执行授权命令 报错信息 Navicat连接mysql报2013错误 2013-Lost connection to MYSQL serve…

Next.js 路由使用完整指南

Next.js 路由使用指南 目录 基础路由 index 路由页面路由布局路由 嵌套路由 文件夹嵌套共享布局 动态路由 单参数路由多参数路由可选参数 路由组 组织结构共享布局 平行路由 同时渲染条件渲染 拦截路由 模态框照片预览 最佳实践 路由组织性能优化类型安全 1. 基础路由 Nex…

Vue2-从零搭建一个项目(项目基本结构介绍)

目录 一、脚手架安装 二、项目结构介绍 1、项目结构介绍 2、组件关系与脚手架入口内置关系 &#xff08;1&#xff09;组件关系 &#xff08;2&#xff09;脚手架入口内置关系 一、脚手架安装 在默认安装Node.js的前提下&#xff0c;需要进行两两步操作 直接参照下面的…

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…

8. Debian系统中显示屏免密码自动登录

本文介绍如何在Debian系统上&#xff0c;启动后&#xff0c;自动免密登录&#xff0c;不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器&#xff0c;所以&#xff0c;一般需要修改它的配置文件/etc/lightdm/lightdm.conf&#xff0c;找到[Seat…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文&#xff0c;一手掌握&#xff0c;你值得拥有&#xff0c;让我们开始吧&#xff5e; ufw 与 iptables的关系 理论介绍&#xff1a; ufw&#xff08;Uncomplicated Firewall&#xff09;是一个基于iptables的前端工具&#xf…

MySQL常见面试题(二)

MySQL 索引 MySQL 索引相关的问题比较多&#xff0c;对于面试和工作都比较重要&#xff0c;于是&#xff0c;我单独抽了一篇文章专门来总结 MySQL 索引相关的知识点和问题&#xff1a;MySQL 索引详解 。 MySQL 查询缓存 MySQL 查询缓存是查询结果缓存。执行查询语句的时候&a…

红日靶场vulnstark 2靶机的测试报告

目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Weblogic漏洞利用 3、Getshell 4、CS上线 5、内网信息收集 利用zerologon漏洞攻击域控服务器(获取密码) 6、横向移动 ①使用PsExec上线域控服务器 ②使用…

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

MFC工控项目实例三十五读取数据库数据

点击按钮打开文件夹中的数据文件生成曲线 相关代码 void CSEAL_PRESSUREDlg::OnTesReport() {CFileDialog dlgOpen(TRUE/*TRUE打开&#xff0c;FALSE保存*/,0,0,OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST,"All Files(mdb.*)|*.*||",//文件过滤器NULL);CString mdb_1, m…

Harnessing Large Language Models for Training-free Video Anomaly Detection

标题&#xff1a;利用大型语言模型实现无训练的视频异常检测 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Zanella_Harnessing_Large_Language_Models_for_Training-free_Video_Anomaly_Detection_CVPR_2024_paper.pdf 源码链接&#xff1a;ht…

Linux笔试题(自己整理,已做完,选择题)

详细Linux内容查看&#xff1a;day04【入门】Linux系统操作-CSDN博客 1、部分笔试题 本文的笔试题&#xff0c;主要是为了复习学习的day04【入门】Linux系统操作-CSDN博客的相关知识点。后续还会更新一些面试相关的题目。 欢迎一起学习

BA是什么?

1.BA的定义 BA的中文译为“光束法平差”,也有翻译为“束调整”、“捆绑调整”等,是一种用于计算机视觉和机器人领域的优化技术,主要用于精确优化相机参数(包括内参数和外参数)和三维空间中特征点的位置。BA的目标是通过最小化重投影误差来提高三维重建的精度和一致性。重投影误…

Windows系统搭建Docker

Windows系统搭建Docker 一、系统虚拟化1.1启用虚拟化1.2启用Hyper-v并开启虚拟任务 二、安装WSL2.1 检验安装2.2 命令安装WSL&#xff08;与2.3选其一&#xff09;2.3 手动安装WSL&#xff08;与2.2选其一&#xff09;2.4 将 WSL 2 设置为默认版本 三、docker安装 一、系统虚拟…

洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)

题目链接&#xff1a;P4715 【深基16.例1】淘汰赛 - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 刷题心得&#xff1a;本题是我二刷&#xff0c;之前第一次刷是在洛谷线性表那个题单&#xff0c;当时印象深刻第 一篇题解是用的树来做&#xff0c;当时我不屑一顾&…