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

【数据结构】模拟实现无头单向非循环链表

链表的概念

学过ArrayList后我们知道它的底层是用数组来存储元素的,是连续的存储空间,当我们要从ArrayList任意位置删除或插入元素时,我们要把后续整体向前或后移动,时间复杂度为O(n),效率比较低,因此ArrayList不适合做需要过多任意位置插入或删除的场景,这种场景我们使用LinkedList(链表)比较合适。
链表的一个节点分为值域(存储的是节点的值)和指针域(存储的是下一个节点的地址),链表的逻辑顺序是连续的,但物理地址不一定是连续的因为节点是从堆中申请出来的,从堆中申请的空间是按照一定的策略分配的,两次申请的空间可能是连续的,也有可能不连续。

模拟实现无头单向非循环链表

//无头单向非循环链表实现
public class SingleLinkedList {static class ListNode{public int val;//节点值域public ListNode next;//节点指针域  下一个节点的地址public ListNode(int val) {this.val = val;}}ListNode head;//当前链表的头节点//初始化一个简单的链表public void createList(){ListNode node1 = new ListNode(11);ListNode node2 = new ListNode(22);ListNode node3 = new ListNode(33);ListNode node4 = new ListNode(44);ListNode node5 = new ListNode(55);node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;this.head = node1;}
}

链表常用的方法

//头插法
public void addFirst(int data)//尾插法
public void addLast(int data)//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data)//查找是否包含关键字key是否在单链表当中
public boolean contains(int key)//删除第一次出现关键字为key的节点
public void remove(int key)//删除所有值为key的节点
public void removeAllKey(int key)//得到单链表的长度
public int size()//清除链表
public void clear()

实现addFirst方法(头插法)

public void addFirst(int data) {ListNode node = new ListNode(data);//让要插入的节点的指针域指向头节点node.next = head;//让插入的节点成为头节点head = node;
}

实现addList方法(尾插法)

要实现尾插法,我们就必须要找到最后一个节点,所以我们要遍历链表,遍历链表的时候我们可以定义一个节点指向头节点然后让定义的节点向后去遍历链表

public void addLast(int data) {ListNode node = new ListNode(data);//定义一个节点cur指向头节点ListNode cur = head;//判断链表是否为空 如果为空就直接插入if (cur==null){head = node;return;}//遍历链表找到最后一个节点while (cur.next!=null){cur = cur.next;}//插入节点cur.next = node;
}

实现size方法(获取链表的长度)

public int size() {//定义一个变量来记录链表长度int count = 0;ListNode cur = head;//遍历链表while (cur!=null){count++;cur = cur.next;}return count;
}

实现addIndex方法(在任意位置插入元素)

public void addIndex(int index, int data) {//判断要插入的位置是否合法if (index<0||index>size()){System.out.println("index 不合法"+index);return;}//index为0 我们使用头插if (index==0){addFirst(data);return;}//index等于链表的长度我们可以使用尾插if (index==size()){addLast(data);return;}ListNode node = new ListNode(data);ListNode cur = head;for (int i = 0; i < index-1; i++) {cur = cur.next;}node.next = cur.next;cur.next = node;
}

实现contains方法(查找是否包含关键字key是否在单链表当中)

public boolean contains(int key) {ListNode cur = head;//如果链表为空直接返回falsewhile (cur!=null){//判断是否是key 是返回true 不是则遍历下一个节点if (cur.val==key){return true;}cur = cur.next;}return false;
}

实现remove方法(删除第一次出现关键字为key的节点)

我们可以先定义一个方法查看key是否在链表中

private ListNode searchKey(int key){ListNode cur = head;while (cur.next!=null){//判断cur是否是要删除节点的前一个节点if (cur.next.val==key){return cur;}cur = cur.next;}return null;
}
public void remove(int key) {//判断链表是否为空if (head==null){return;}//判断头节点是否为要删除的节点if (head.val==key){head = head.next;return;}//查找key是否在链表中 不在则返回nullListNode cur = searchKey(key);if (cur==null){System.out.println("没有key的节点"+key);return;}//因为cur是要删除节点的前一个节点 所以cur.next才是要删除的节点ListNode del = cur.next;cur.next = del.next;
}

实现removeAllKey方法(删除所有值为key的节点)

public void removeAllKey(int key) {//判断链表是否为空if (head==null){return;}//要删除节点的前驱ListNode prev = head;//要删除的节点ListNode 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;}
}

实现clear方法(清除链表)

//只需将头节点置为空即可
public void clear() {head = null;
}

相关文章:

【数据结构】模拟实现无头单向非循环链表

链表的概念 学过ArrayList后我们知道它的底层是用数组来存储元素的&#xff0c;是连续的存储空间&#xff0c;当我们要从ArrayList任意位置删除或插入元素时&#xff0c;我们要把后续整体向前或后移动&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此Arra…...

linux驱动开发学习001:概述

linux的内核源码编译后&#xff0c;会生成一个总的镜像。镜像加载到内存中运行他&#xff0c;就会启动内核。驱动属于内核代码的一部分&#xff0c;对驱动修改要重编整个内核&#xff0c;麻烦但驱动可以独立于内核镜像外&#xff0c;并能动态加载和卸载字符设备驱动&#xff0c…...

安全响应中心 — 垃圾邮件事件报告(10.13)

2023年10月 第二周 一. 样本概况 ✅ 案例1&#xff1a;DocuSign钓鱼 本周收到一封看似来自 DocuSign&#xff08;DocuSign 是一种在企业环境中广泛使用的电子协议管理平台&#xff09;的网络钓鱼电子邮件反馈。 如下图所示&#xff1a; 以上样本内容大体是说XX发送了一份文…...

扩散模型Diffusers Pipeline API使用介绍

1 关于Diffusers Pipeline 1.1 简介 大部分扩散模型包含多个独立训练的子模型和组件模块组合而成&#xff0c;例如StableDiffusion 有&#xff1a; 3个独立训练的子模型&#xff1a;Autoencoder、 Conditional Unet、CLIP text encoder调度器组件scheduler,CLIPImageProcesso…...

el-date-picker 组件 监听输入的内容 并按照时间格式 格式化

这个时间选择组件在输入的时候是监听不到输入的值的&#xff0c;所以我们在外层再套个div&#xff0c;然后用获取焦点事件去操作dom 页面中 <div id"inParkingData"><el-date-pickerv-model"indateRange"size"small"value-format"…...

组件通信$refs | $parent |$root

父组件传值子组件用Props 子组件传值父组件用$emit 父组件直接还可以直接取子组件的值用$refs 父组件直接从子子组件中获取值$refs 不建议使用会增加组件之间的耦合度&#xff0c;一般用于第三方插件的封装 ref如果绑定在dom节点上&#xff0c;拿到的就是原生dom节点。 ref如…...

springboot中@Async的使用

1.AsyncAnnotationBeanPostProcessor是主要逻辑类 (1)AsyncAnnotationBeanPostProcessor实现BeanFactoryAware接口 在setBeanFactory(BeanFactory beanFactory)中初始化advisorAsyncAnnotationAdvisor() (2)AsyncAnnotationBeanPostProcessor实现BeanPostProcessor接口 在p…...

学C++从CMake学起

Cmake在此引入c17编译器&#xff0c;就可以使用c17的新特性了。 c17定义了一些算法&#xff0c;都定义在了下面这个头文件里。 #include <numeric> 通过redurce函数求和 将9行的std::plus{}换成std::times{}就是相乘。...

lv8 嵌入式开发-网络编程开发 20 域名解析与http服务实现原理

目录 1 域名解析 2 如何实现万维网服务器&#xff1f; 2.1 HTTP 的操作过程 2.2 万维网服务器实现 1 域名解析 域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下&#xff1a; struct hostent {char *h_name; /* 官方域名 */char **h_alias…...

只要路由器有WPS按钮,佳能打印机连接到Wi-Fi网络的方法就很简单

佳能打印机是很好的设备&#xff0c;可以让你从智能手机、电脑或平板电脑打印照片。它们还提供其他功能&#xff0c;如扫描文档和复制图像。 最新的型号还允许你连接到Wi-Fi&#xff0c;因此你不需要使用电线将设备连接到打印机。 Wi-Fi是通过本地网络传输数据的标准方式。它…...

Cmake输出git内容方式

实现背景 在定位问题时&#xff0c;固件无法获取当前设备中版本的详细信息&#xff0c;无法准确获取版本具体内容 输出效果 实现方式 以下是基于Cmake的语法实现 在CMake中获取git信息&#xff0c;可以通过execute_process命令运行git命令并将结果保存在一个变量中。然后可…...

实现多余内容变成省略号

实现效果 代码 <p class"item-content">{{ item.content }}</p>样式 .item-content {white-space: nowrap;/* 禁止换行 */overflow: hidden;/* 隐藏溢出部分 */text-overflow: ellipsis;/* 使用省略号表示溢出部分 */ }...

WAL 模式(PostgreSQL 14 Internals翻译版)

性能 当服务器正常运行时&#xff0c;WAL文件不断被写入磁盘。但是&#xff0c;这些写操作是顺序的:几乎没有随机访问&#xff0c;因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同&#xff0c;因此有必要为WAL文件设置一个单独的物理存储&a…...

2023年信息科学与工程学院学生科协第二次软件培训

2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题&#xff1a;练习题&#xff1a; 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…...

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…...

notes_NLP

RNN > LSTM, GRU model特点RNNLSTMinputforgetputput&#xff1b;GRUresetupdate&#xff1b;参数比LSTM少&#xff0c;计算效率更高&#xff1b; 循环神经网络&#xff08;RNN/LSTM/GRU&#xff09; 人人都能看懂的GRU transformer > self-attention 根据Query和Key计…...

内存分段、分页

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 前言 每个进程都有一套自己的虚拟地址&#xff0c;尽管进程可能有相同的虚拟地址&#xff0c;…...

Python-pptx教程之一从零开始生成PPT文件

简介 python-pptx是一个用于创建、读取和更新PowerPoint&#xff08;.pptx&#xff09;文件的python库。 典型的用途是根据动态内容&#xff08;如数据库查询、分析数据等&#xff09;&#xff0c;将这些内容自动化生成PowerPoint演示文稿&#xff0c;将数据可视化&#xff0c…...

k8s 使用ingress-nginx访问集群内部应用

k8s搭建和部署应用完成后&#xff0c;可以通过NodePort&#xff0c;Loadbalancer&#xff0c;Ingress方式将应用端口暴露到集群外部&#xff0c;提供外部访问。 缺点&#xff1a; NodePort占用端口&#xff0c;大量暴露端口非常不安全&#xff0c;并且有端口数量限制【不推荐】…...

企业数据泄露怎么办?

随着数字化时代的到来&#xff0c;威胁企业数据安全的因素越来越多。一旦机密数据泄露&#xff0c;不仅会对企业造成巨大的经济损失&#xff0c;还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时&#xff0c;企业该怎样应对&#xff1f; 1.确认数据泄露 确认是…...

Qt Modbus 报文构建实战:QModbusRequest构造与sendRawRequest发送详解

1. Qt Modbus开发环境搭建与基础概念 在工业自动化领域&#xff0c;Modbus协议就像设备之间的"普通话"&#xff0c;而Qt Modbus库则是我们与设备对话的翻译器。我刚开始接触这个领域时&#xff0c;花了一整天时间才搞明白如何正确发送一个简单的控制指令。下面分享我…...

告别枯燥理论:用GhostPack的Certify和Rubeus,5步搞定Active Directory证书服务(ADCS) ESC1漏洞检测与利用

实战ADCS漏洞利用&#xff1a;从零构建ESC1攻击链的完整指南 Active Directory证书服务(ADCS)作为企业身份验证基础设施的核心组件&#xff0c;其安全配置往往被低估。当证书模板配置不当&#xff0c;攻击者可能利用ESC1漏洞实现从普通域用户到域管理员的权限提升。本文将带您搭…...

为什么93%的团队在Python 3.14 JIT上线后性能反降?深度解析JIT热路径识别失效与类型推测崩塌链

第一章&#xff1a;Python 3.14 JIT编译器性能反降现象的全局观测与归因定位近期多个基准测试套件在 Python 3.14 alpha 版本中观测到显著的性能退化&#xff0c;尤其在 CPU 密集型循环与协程调度场景下&#xff0c;pystone、pyperf benchmarks 的吞吐量平均下降 12.7%&#xf…...

gdocs2md安装与配置完全教程:如何正确设置Google Apps Script

gdocs2md安装与配置完全教程&#xff1a;如何正确设置Google Apps Script 【免费下载链接】gdocs2md Convert a Google Drive Document to the Markdown format, suitable for publishing. 项目地址: https://gitcode.com/gh_mirrors/gd/gdocs2md gdocs2md是一款简单实用…...

CosyVoice-300M Lite常见问题解决:音色选择与API调用详解

CosyVoice-300M Lite常见问题解决&#xff1a;音色选择与API调用详解 1. 音色选择指南 1.1 内置音色类型与特点 CosyVoice-300M Lite提供了6种预设音色&#xff0c;每种音色适合不同的应用场景&#xff1a; female_1&#xff1a;标准女声&#xff0c;发音清晰&#xff0c;适…...

OFA图文蕴含推理系统应用场景:元宇宙空间图文语义对齐

OFA图文蕴含推理系统应用场景&#xff1a;元宇宙空间图文语义对齐 1. 引言&#xff1a;当元宇宙需要一双“慧眼” 想象一下&#xff0c;你戴上VR眼镜&#xff0c;进入一个虚拟的购物中心。你看到一件虚拟T恤&#xff0c;旁边的文字描述写着“纯棉材质&#xff0c;胸前有卡通印…...

Redis 只会用缓存?16种妙用让同事直呼牛X

1、缓存String 类型例如&#xff1a;热点数据缓存&#xff08;例如报表、明星出轨&#xff09;&#xff0c;对象缓存、全页缓存、可以提升热点数据的访问数据。2、数据共享分布式String 类型&#xff0c;因为 Redis 是分布式的独立服务&#xff0c;可以在多个应用之间共享例如&…...

Golang GORM怎么做Scopes复用_Golang GORM Scopes教程【推荐】

Scopes 是接收并返回 *gorm.DB 的函数&#xff0c;用于链式构建查询&#xff1b;需严格签名、避免提前执行、显式传参、控制分页参数、顺序影响SQL逻辑、事务中注意句柄、不处理错误。Scopes 就是带参数的 func(*gorm.DB) *gorm.DB它不是魔法&#xff0c;就是个普通函数签名——…...

无需训练!实时手机检测-通用模型直接使用,效果媲美YOLO

无需训练&#xff01;实时手机检测-通用模型直接使用&#xff0c;效果媲美YOLO 你是不是也遇到过这样的场景&#xff1a;想快速开发一个手机检测功能&#xff0c;比如检测视频里有没有人在用手机打电话&#xff0c;或者统计会议室里有多少人带了手机。传统方法要么需要自己收集…...

【C++27协程调试终极指南】:20年专家亲授5大不可外泄的断点追踪黑科技

第一章&#xff1a;C27协程调试的底层模型与认知重构 C27将首次将协程&#xff08;coroutine&#xff09;纳入核心语言调试规范&#xff0c;其调试模型不再依赖于传统栈帧回溯&#xff0c;而是围绕可恢复执行上下文&#xff08;resumable execution context&#xff09;、挂起点…...