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

数据结构-链表的简单操作实现

目录

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.插入任意位置&#xff08;规定第一个元素位置为0下标&#xff09; 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

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 买卖股票的最佳时机 III买卖…...

苹果手机如何备份通讯录?看完这篇就懂了!

如果遇到手机丢失或者出现故障的情况&#xff0c;通讯录备份可以避免联系人信息丢失。另外&#xff0c;当用户更换手机或者进行数据迁移时&#xff0c;提前备份好的通讯录数据可以快速还原到新设备上&#xff0c;避免了手动输入联系人的麻烦。苹果手机如何备份通讯录&#xff1…...

[yarn]yarn异常

一、运行一下算圆周率的测试代码&#xff0c;看下报错 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个数字参数的含义&#xff1a; 第1个1000指的是要运行1000次map任务 …...

C++ NULL 与nullptr 区别

在编写C程序的时候只看到过NULL&#xff0c;而在C的编程中&#xff0c;我们可以看到NULL和nullptr两种关键字&#xff0c;其实nullptr是C11版本中新加入的&#xff0c;它的出现是为了解决NULL表示空指针在C中具有二义性的问题。 一、C程序中的NULL 在C语言中&#xff0c;NULL…...

Google Chrome 浏览器 119.0.6045.106 版本提示 STATUS_INVALID_IMAGE_HASH 崩溃

问题 今天更新 Google Chrome 浏览器到 119.0.6045.106 版本&#xff0c;然后访问页面不是空白&#xff0c;就是页面崩溃了 解决方案 我在网上找了几种&#xff0c;下面这个方式符合&#xff0c;能解决我的问题&#xff0c;就是在快捷方式的属性那里&#xff0c;找到目标给它…...

网络IO

网络IO 阻塞模型 在之前网络通信都是阻塞模型 客户端向服务端发出请求后&#xff0c;客户端会一直处于等待状态&#xff0c;直到服务器端返回结果或网络出现问题 服务器端也是如此&#xff0c;在处理某个客户端A发来的请求时&#xff0c;另一个客户端B发来的请求会等待&#xf…...

数据库管理-第115期 too many open files(202301107)

数据库管理-第115期 too many open files&#xff08;202301107&#xff09; 这是我上周末帮朋友站台过程中处理的一个问题。 1 背景 其实这是别人搭的一个使用CentOS 7.8系统安装的一套11.2.0.4&#xff08;无补丁&#xff09;的双节点RAC&#xff0c;用于迁移以前运行在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 将行列式转换为&#xff08;二&#xff09;中的特殊行列式 2 特殊行列式2.1 上三角或下三角行列式2.2 三叉行列式2.3 行列式行和&…...

OpenCV入门7:图像形态学变换

形态学是一种针对图像形状和结构进行操作和分析的图像处理方法。在OpenCV中&#xff0c;提供了一些函数和方法用于执行形态学操作。下面将介绍一些常见的形态学操作及其在OpenCV中的实现方式。 膨胀&#xff08;Dilation&#xff09;&#xff1a; 膨胀操作可以扩展图像中的边…...

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 不仅可以文生图&#xff0c;还可以图生图。文生图就是完全用提示词文本去生成我们想要图片&#xff0c;但是很多时候会有词不达意的感觉。就像我们房子装修一样&#xff0c;我们只是通过文字描述很难表达出准确的想要的装修效果&#xff0c;如果能…...

Nat. Med. | 基于遗传学原发部位未知癌症的分类和治疗反应预测

今天为大家介绍的是来自Alexander Gusev团队的一篇论文。原发部位未知癌症&#xff08;Cancer of unknown primary&#xff0c;CUP&#xff09;是一种无法追溯到其原发部位的癌症&#xff0c;占所有癌症的3-5&#xff05;。CUP缺乏已建立的靶向治疗方法&#xff0c;导致普遍预后…...

RocketMQ如何安全的批量发送消息❓

优点&#xff1a; 批量发送消息可以提高rocketmq的生产者性能和吞吐量。 使用场景: 发送大量小型消息时&#xff1b;需要降低消息发送延迟时&#xff1b;需要提高生产者性能时&#xff1b; 注意事项&#xff1a; 消息列表的大小不能超过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 数据库并将数据存储在数据表中&#xff0c;使用 Java 和 JDBC&#xff08;Java Database Connectivity&#xf…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...

[electron]预脚本不显示内联script

script-src self 是 Content Security Policy (CSP) 中的一个指令&#xff0c;它的作用是限制加载和执行 JavaScript 脚本的来源。 具体来说&#xff1a; self 表示 当前源。也就是说&#xff0c;只有来自当前网站或者当前页面所在域名的 JavaScript 脚本才被允许执行。"…...

SQL 注入开放与修复

开发&#xff1a; SQL 注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原 SQL 语句的含义&#xff0c; 进而执行任意 SQL 命令&#xff0c;达到入侵数据库乃至操作系统的目的。 例如&#xff1a;下面代码片段中&#xff0c;动态构造并执行了一个 SQ…...

词法分析和词性标注 自然语言处理

目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原&#xff08;和正常英语的词法变化一样&#xff09; 1.有规律变化单词的形态还原 ​编辑 2.动词&#xff64;名词&#xff64;形容词&#xff64;副词不规则变化单词的形态还原 3.对于表示年代&…...