数据结构-链表的简单操作实现
目录
0.链表前序工作
1.构建出一个链表
2.展示链表中的所有存储数据
3.查找关键字key是否在链表中
4.求链表的长度
5.头插法
6.尾插法
7.插入任意位置(规定第一个元素位置为0下标)
8.删除第一次出现的值为key的关键字
9.删除所有值为key的关键字
10.清空所有节点
0.链表前序工作
在进行链表的相关操作之前,首先需要进行链表的构造。
在一个链表节点中,有两个区域:
一个用来存储当前节点的数据-val;
另一个需要存储下一个节点的地址。
static class Node{public int val;//存储的数据public Node next;//存储下一个节点的地址;//提供一个构造方法public Node(int val){this.val = val;}}
定义一个head,代表当前头节点的引用
public Node head;//代表当前链表头结点的引用
1.构建出一个链表
构建一个链表将构建的链表节点串起来。
这里我们构建四个节点,
public void createLink(){Node node1 = new Node(1);Node node2 = new Node(1);Node node3 = new Node(1);Node node4 = new Node(1);node1.next = node2;node2.next = node3;node3.next = node4;head = node1;}
2.展示链表中的所有存储数据
将存储在链表中的数据进行展示,这里定义一个节点cur,和head相同的指向。
随后将cur向后挪动,当cur的值不为空的时候,向后挪动打印;
当cur的值为空时,证明链表到达了末尾,已经没有元素,进而跳出while循环。
需要注意的内容:
(1)如果要将整个链表遍历完成 那么就要head == null;
(2)如果是遍历到链表的尾巴。条件是head.next == null;
public void display(){//如果要将整个链表遍历完成 那么就要head == null;//如果是遍历到链表的尾巴。条件是head.next == nullNode cur = head;while(cur != null){System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}
3.查找关键字key是否在链表中
在链表中搜寻是否包含关键字key,
同样我们需要一个新的节点和头节点head指向相同的位置;
向后一直走,循环条件是节点的内容不为null,也就是(cur!=null)
存在结果返回true,否则返回false;
public boolean contains(int key){Node cur = head;while (cur != null){if(cur.val == key){return true;}cur = cur.next;}return false;}
4.求链表的长度
链表的长度定义为size(),首先定义变量count等于0,同样定义一个cur节点和head指向相同位置,向后遍历,循环条件为cur != null。每循环一次,计数器数值加1,指针向后挪动一个位置。
public int size(){int count = 0;Node cur = head;while(cur != null){count++;cur = cur.next;}return count;}
5.头插法
进行头插法,首先准备好一个新的节点node,用来存放传进来的数据data;
node的next指向head;
让head指向node。
public void addFirst(int data){Node node = new Node(data);node.next = head;head = node;}
6.尾插法
首先判断是否为第一次插入,当头节点为null的时候,将head指向node节点,返回。
如果不是第一次插入节点,同样定义一个为cur的节点指向head;cur向后挪,直至走到链表最后,将cur的next指向新的节点node,完成尾插操作。
public void addLast(int data){Node node = new Node(data);//判断是不是第一次插入if(head == null){head = node;return;}Node cur = head;while(cur.next != null){cur = cur.next;}cur.next = node;}
7.插入任意位置(规定第一个元素位置为0下标)
在链表中插入任意位置,需要传入两个值-位置下标、插入的数值.
判断要插入的位置是否合法:自己写一个方法检查下标:checkIndex
首先,如果插入下标为0下标-头插法;插入下标为链表的长度size-尾插法;
其他情况就是在链表的中间位置:
需要找到链表中需要插入位置的前一个位置的下标位置:findIndexSubOne。【因为我们在这里讨论的链表为单向不带头节点的链表,必须要找到需要元素需要插入位置的前一个位置,进而进行后续操作】。
得到插入到链表中前一个位置的下标,定义为cur;要插入的数据定义为node;
具体两步的指向如下图所示。
public void addIndex(int index,int data)throws ListIndexOutOfException{checkIndex(index);if(index == 0){addFirst(data);return;}if(index == size()){addLast(data);return;}Node cur = findIndexSubOne(index);Node node = new Node(data);node.next = cur.next;cur.next = node;}
checkIndex
private void checkIndex(int index){if(index < 0 || index > size()){throw new ListIndexOutOfException("index位置不合法!");}}
ListIndexOutOfException
public class ListIndexOutOfException extends RuntimeException{public ListIndexOutOfException() {}public ListIndexOutOfException(String message) {super(message);}
}
findIndexSubOne
private Node findIndexSubOne(int index){Node cur = head;int count = 0;while (count != index -1){cur = cur.next;count++;}return cur;}
8.删除第一次出现的值为key的关键字
删除第一次出现的值为key的关键字
首先当链表的表头就是我们要找的关键字:将头节点向后挪动,返回即可。
寻找到要删除节点的前一个节点:searchPrev(key)
public void remove(int key){if(head.val == key){head = head.next;return;}Node cur = searchPrev(key);//代表当前节点if(cur == null){return ;}Node del = cur.next;//代表要删除的节点cur.next = del.next;}
searchPrev(key)
private Node searchPrev(int key){if(head == null){return null;//一个节点都没有}Node cur = head;while(cur.next != null){if(cur.next.val == key){return cur;}cur = cur.next;}//代表根本没有要删除的节点return null;}
9.删除所有值为key的关键字
在链表中删除所有值为key的关键字
首先判断链表中有无元素,如果头节点的指向为null的话,返回return;
在这里定义两个指针prev指向头的位置;
cur指向头的下一个位置。
这里选择先不进行对头结点的判定
public void removeAllKey(int key){if(head == null){return;}Node prev = head;Node 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(){head = null;}
相关文章:
数据结构-链表的简单操作实现
目录 0.链表前序工作 1.构建出一个链表 2.展示链表中的所有存储数据 3.查找关键字key是否在链表中 4.求链表的长度 5.头插法 6.尾插法 7.插入任意位置(规定第一个元素位置为0下标) 8.删除第一次出现的值为key的关键字 9.删除所有值为key的关键字…...
竞赛选题 深度学习手势识别 - yolo python opencv cnn 机器视觉
文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…...
【算法练习Day42】买卖股票的最佳时机 III买卖股票的最佳时机 IV
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 买卖股票的最佳时机 III买卖…...
苹果手机如何备份通讯录?看完这篇就懂了!
如果遇到手机丢失或者出现故障的情况,通讯录备份可以避免联系人信息丢失。另外,当用户更换手机或者进行数据迁移时,提前备份好的通讯录数据可以快速还原到新设备上,避免了手动输入联系人的麻烦。苹果手机如何备份通讯录࿱…...
[yarn]yarn异常
一、运行一下算圆周率的测试代码,看下报错 cd /home/data_warehouse/module/hadoop-3.1.3/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-3.1.3.jar pi 1000 1000 后面2个数字参数的含义: 第1个1000指的是要运行1000次map任务 …...
C++ NULL 与nullptr 区别
在编写C程序的时候只看到过NULL,而在C的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C11版本中新加入的,它的出现是为了解决NULL表示空指针在C中具有二义性的问题。 一、C程序中的NULL 在C语言中,NULL…...
Google Chrome 浏览器 119.0.6045.106 版本提示 STATUS_INVALID_IMAGE_HASH 崩溃
问题 今天更新 Google Chrome 浏览器到 119.0.6045.106 版本,然后访问页面不是空白,就是页面崩溃了 解决方案 我在网上找了几种,下面这个方式符合,能解决我的问题,就是在快捷方式的属性那里,找到目标给它…...
网络IO
网络IO 阻塞模型 在之前网络通信都是阻塞模型 客户端向服务端发出请求后,客户端会一直处于等待状态,直到服务器端返回结果或网络出现问题 服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待…...
数据库管理-第115期 too many open files(202301107)
数据库管理-第115期 too many open files(202301107) 这是我上周末帮朋友站台过程中处理的一个问题。 1 背景 其实这是别人搭的一个使用CentOS 7.8系统安装的一套11.2.0.4(无补丁)的双节点RAC,用于迁移以前运行在So…...
一行命令让你的服务器命令行亮起来!!!!
if [ "$(whoami)" "root" ]; then echo "PS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# " >> /root/.bashrc; source /root/.bashrc; echo "已为root用户设置提示符以#结尾…...
线性代数(二)| 行列式性质 求值 特殊行列式 加边法 归纳法等多种方法
文章目录 1. 性质1.1 重要性质梳理1.1.1 转置和初等变换1.1.2加法行列式可拆分1.1.3 乘积行列式可拆分 1.2 行列式性质的应用1.2.1 简化运算1.2.2 将行列式转换为(二)中的特殊行列式 2 特殊行列式2.1 上三角或下三角行列式2.2 三叉行列式2.3 行列式行和&…...
OpenCV入门7:图像形态学变换
形态学是一种针对图像形状和结构进行操作和分析的图像处理方法。在OpenCV中,提供了一些函数和方法用于执行形态学操作。下面将介绍一些常见的形态学操作及其在OpenCV中的实现方式。 膨胀(Dilation): 膨胀操作可以扩展图像中的边…...
Apache Storm 2.5.0 集群安装与配置
1、下载Apache Storm 2.5.0 https://mirrors.tuna.tsinghua.edu.cn/apache/storm/apache-storm-2.5.0/ 2、准备3台服务器 192.168.42.139 node1 192.168.42.140 node1 192.168.42.141 node2 3、配置host [rootnode1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost…...
Android-将编码的base64图像,添加水印,转换成File存储到手机
一、将图片file转换成bitmap Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 二、给图片添加水印 String[] content = new String[]{"纬度:" + latitude, "经度:" + longitude, "地址:" + signAddress, "时间:&…...
AI 绘画 | Stable Diffusion 图生图
图生图简介 Stable Diffusion 不仅可以文生图,还可以图生图。文生图就是完全用提示词文本去生成我们想要图片,但是很多时候会有词不达意的感觉。就像我们房子装修一样,我们只是通过文字描述很难表达出准确的想要的装修效果,如果能…...
Nat. Med. | 基于遗传学原发部位未知癌症的分类和治疗反应预测
今天为大家介绍的是来自Alexander Gusev团队的一篇论文。原发部位未知癌症(Cancer of unknown primary,CUP)是一种无法追溯到其原发部位的癌症,占所有癌症的3-5%。CUP缺乏已建立的靶向治疗方法,导致普遍预后…...
RocketMQ如何安全的批量发送消息❓
优点: 批量发送消息可以提高rocketmq的生产者性能和吞吐量。 使用场景: 发送大量小型消息时;需要降低消息发送延迟时;需要提高生产者性能时; 注意事项: 消息列表的大小不能超过broker设置的最大消息大小;消息列表…...
计算机视觉与深度学习 | 基于视觉惯性紧耦合的SLAM后端优化算法
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于视觉惯性紧耦合的SLAM后端优化算法 引言视觉惯性联合初始化非线性优…...
GDI+ 绘制透明图
目录 一、GDI+ 准备工作 1、线程中添加GDI+支持 2、Gdiplus::Bitmap 1)、从文件创建位图...
【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据
目录 0 准备工作1 创建Java项目2 添加JDBC 驱动程序3 创建数据库连接配置文件4 创建一个 Java 类来连接和操作数据库5 运行应用程序 在 IntelliJ IDEA 中连接 MySQL 数据库并将数据存储在数据表中,使用 Java 和 JDBC(Java Database Connectivity…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...


