【数据结构】实现单链表的增删查
目录
- 1.定义接口
- 2.无头单链表实现接口
- 2.1 头插addFirst
- 2.2 尾插add
- 2.3 删除元素remove
- 2.4 修改元素set
- 2.5 获取元素get
- 3.带头单链表实现接口
- 3.1 头插addFirst
- 3.2 尾插add
- 3.3 删除元素remove
- 3.4 判断是否包含元素element
1.定义接口
public interface SeqList<E>{//默认尾插void add(E element);// 在线性表中插入新元素,插入后的元素下标为indexvoid add(int index,E element);//头插public void addFirst(E val);// 删除当前线性表中索引为index的元素,返回删除的元素值E removeByIndex(int index);// 删除当前线性表中第一个值为element的元素void removeByValue(E element);// 删除当前线性表中所有值为element的元素void removeAllValue(E element);// 将当前线性表中index位置的元素替换为element,返回替换前的元素值E set(int index,E element);//返回索引位index的元素E get(int index);//查询是否包含element元素boolean contains(E element);
}
2.无头单链表实现接口
链表类和节点类的定义:
public class SingleLinkedList<E> implements SeqList<E>{private Node head ;//第一节车厢的地址private int size;//车厢节点的个数,保存的元素个数//定义一个车厢类,车厢作为火车的私有内部类,对外部完全隐藏private class Node{E val;//保存的元素Node next;//下一节车厢的地址//构造方法Node(E val){this.val=val;}}}
2.1 头插addFirst
public void addFirst(E val){Node node=new Node(val);node.next=head;node=head;size++;
}
图解:

2.2 尾插add
从中间位置插入:
@Overridepublic void add(int index, E element) {if(index<0||index>size){throw new IllegalArgumentException("add index ILLegal");}//判断没有前驱的情况if(index==0){addFirst(element);return;}//中间位置插入Node prey=head;for(int i=0;i<index-1;i++){prey=prey.next;}Node node=new Node(element);node.next=prey.next;prey.next=node;size++;}
图解:假定index=2

尾插:
@Overridepublic void add(E element) {add(size,element);}
2.3 删除元素remove
删除当前线性表中索引为index的元素,返回删除的元素值:
@Overridepublic E removeByIndex(int index) {if(rangeCheck(index)){throw new IllegalArgumentException("remove index Illegal");}//头节点的删除if(index==0){Node node=head;head=head.next;node.next=null;size--;return node.val;}//中间位置删除Node prey=head;for(int i=0;i<index-1;i++){prey=prey.next;}Node node=prey.next;prey.next=node.next;node.next=null;size--;return node.val;}
图解:

删除当前线性表中第一个值为element的元素:
@Overridepublic void removeByValue(E element) {//1.base caseif(head==null){return;}//2.判断头节点恰好是待删除的节点if(head.val.equals(element)){head=head.next;size--;return;}//3.此时头节点不为空其一定不是待删除的节点Node prey=head;while(prey.next!=null){if(prey.next.equals(element)){prey.next=prey.next.next;size--;return;}prey=prey.next;}//4.当前链表不存在值为element的元素System.out.println("当前链表不存在值为"+element+"的元素");}
删除当前线性表中所有值为element的元素:
@Overridepublic void removeAllValue(E element) {//1.base caseif(head==null){return;}//2.若头节点就是待删除的节点且出现连续的待删除的节点while(head!=null && head.val.equals(element)){head=head.next;size--;}//整个链表已经删完了if(head==null){return;}//3.头节点一定不是待删除的元素且链表不为空Node prey=head;while(prey.next!=null){if(prey.next.val.equals(element)){prey.next=prey.next.next;size--;}else{//只有后继节点不是待删除的节点才能移动Prey的引用prey=prey.next;}}}
2.4 修改元素set
将当前线性表中index位置的元素替换为element,返回替换前的元素值:
// 将当前线性表中index位置的元素替换为element,返回替换前的元素值@Overridepublic E set(int index, E element) {if(!rangeCheck(index)){throw new IllegalArgumentException("set index illegal");}Node x=head;//遍历,走到index对应的元素for (int i = 0; i < index; i++) {x=x.next;}E oldVal=x.val;x.val=element;return oldVal;}//合法性校验private boolean rangeCheck(int index){if(index<0||index>=size){return false;}return true;}
2.5 获取元素get
返回索引为index的元素:
@Overridepublic E get(int index) {if(!rangeCheck(index)){throw new IllegalArgumentException("get index illegal");}Node x=head;for(int i=0;i<index;i++){x=x.next;}return x.val;}
3.带头单链表实现接口

由于单链表中都需要额外处理头结点的情况,引入一个虚拟头结点,这个节点不存在具体的值,就作为链表的头来使用,使每个有值的节点都有一个前驱。(所有操作都统一了,无论是插入还是删除,都可以看作是中间位置的插入和删除)
链表类和节点类的定义:
public class SingleLinkedListWithHead <E> implements SeqList<E>{//当前链表一定存在火车头且不存储任何元素private Node dummyHead=new Node(null);//具体的元素个数private int size;private class Node{E val;Node next;Node(E val){this.val=val;}}
}
3.1 头插addFirst
public void addFirst(E val){Node node=new Node(val);node.next=dummyHead.next;dummyHead.next=node;size++;}
图解:

3.2 尾插add
@Overridepublic void add(E element) {add(size,element);return;}@Overridepublic void add(int index, E element) {if(index<0||index>size){throw new IllegalArgumentException("Remove index illegal");}Node prey=dummyHead;for(int i=0;i<index;i++){prey=prey.next;}Node node=new Node(element);node.next=prey.next;prey.next=node;size++;}
3.3 删除元素remove
@Overridepublic void removeAllValue(E element) {//prey一定指向不是待删除的节点Node prev=dummyHead;while(prev.next!=null){if(prev.next.val==element){prev.next=prev.next.next;size--;}else{prev=prev.next;}}}
3.4 判断是否包含元素element
@Overridepublic boolean contains(E element) {while(dummyHead.next!=null){if(dummyHead.next.val.equals(element)){return true;}dummyHead.next=dummyHead.next.next;}return false;}
相关文章:
【数据结构】实现单链表的增删查
目录 1.定义接口2.无头单链表实现接口2.1 头插addFirst2.2 尾插add2.3 删除元素remove2.4 修改元素set2.5 获取元素get 3.带头单链表实现接口3.1 头插addFirst3.2 尾插add3.3 删除元素remove3.4 判断是否包含元素element 1.定义接口 public interface SeqList<E>{//默认…...
Vue2 第二十节 vue-router (四)
1.全局前置路由和后置路由 2.独享路由守卫 3.组件内路由守卫 4.路由器的两种工作模式 路由 作用:对路由进行权限控制 分类:全局守卫,独享守卫,组件内守卫 一.全局前置路由和后置路由 ① 前置路由守卫:每次路由…...
第三章 图论 No.1单源最短路及其综合应用
文章目录 1129. 热浪1128. 信使1127. 香甜的黄油1126. 最小花费920. 最优乘车903. 昂贵的聘礼1135. 新年好340. 通信线路342. 道路与航线341. 最优贸易 做乘法的最短路时,若权值>0,只能用spfa来做,相等于加法中的负权边 1129. 热浪 1129.…...
❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件
❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件 cmd或者终端用nvm 安装提示: npm不是内部或外部命令,也不是可运行的程序或批处理文件 原因(一) 提示这个问题,有可能是Node没有安装,也有可能是没有配置…...
关于Godot游戏引擎制作流水灯
先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序(如FL中TB-303的步进灯) FL Studio Transistor Bass...
C语言 函数指针详解
一、函数指针 1.1、概念 函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址; 示例: int Add(int x,int y) {return xy;} int main() {printf("%p\n",&Add);…...
LNMP及论坛搭建
安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。 yum -y install pcre-devel zlib-devel…...
【使用机器学习和深度学习对城市声音进行分类】基于两种技术(ML和DL)对音频数据(城市声音)进行分类(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Godot 4 练习 - 制作粒子
演示项目dodge_the_creeps中,有一个Trail,具体运行效果 想要看看咋实现的,看完也不清晰,感觉是要设置某些关键的属性 ChatGPT说:以下是一些重要的属性: texture:用于渲染粒子的纹理。您可以使用…...
Java基础继承详解
Java基础继承详解 在Java中,继承是面向对象编程中的一个重要概念。通过继承,一个类可以从另一个类继承属性和方法,使代码重用和扩展更加方便。下面是关于Java基础继承的一些详解: 关键字: 使用extends关键字可以在一个…...
如何维护你的电脑:打造IT人的重要武器
文章目录 方向一:介绍我的电脑方向二:介绍我的日常维护措施1. 定期清理和优化2. 保持良好的上网习惯和安全防护3. 合理安排软件和硬件的使用4. 数据备份和系统还原 方向三:推荐的维护技巧1. 数据分区和多系统安装2. 内部清洁和散热优化3. 安全…...
【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT 3
1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨,在1995年出版的《未来之路》一书中,提及“物物互联”。1998年麻省理工学院提出,当时被称作EPC系统的物联网构想。2005年11月,国际电信联盟发布《ITU互联网…...
Elasticsearch 快照和恢复
文章目录 简介快照存储库说明创建或更新存储库接口说明路径参数查询参数请求正文 使用 fs 方式创建存储库验证储存库获取存储库信息删除存储库清理储存库 快照创建快照路径参数查询参数请求正文示例 获取快照查询参数示例 克隆快照查询参数示例 获取快照状态示例 恢复快照查询参…...
Packet Tracer - 检验 IPv4 和 IPv6 编址
Packet Tracer - 检验 IPv4 和 IPv6 编址 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.97 255.255.255.224 N/A 2001:DB8:1:1::1/64 N/A S0/0/1 10.10.1.6 255.255.255.252 N/A 2001:DB8:1:2::2/64 N/A 本地链路 F…...
PHP8的表达式-PHP8知识详解
表达式是 PHP 最重要的基石。在 PHP8中,几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是"任何有值的东西"。 最基本的表达式形式是常量和变量。当键入"$a 5",即将值"5"分配给变量 $a。&quo…...
亚马逊云科技七项生成式AI新产品生成式AI,为用户解决数据滞后等难题
7月27日,亚马逊云科技在纽约峰会上一连发布了七项生成式AI创新,涵盖了从底层硬件到工具、软件、再到生态的全方位更新,成为它在该领域迄今最全面的一次升级展示,同时也进一步降低了生成式AI的使用门槛。 亚马逊云科技凭借自身端到…...
图片等比例显示全部,兼容不同宽高比例图片
功能描述:预览瀑布流图片 点击预览不同的尺寸图片 <!-- 预览页面 --><div class"sea"><img :src"seaobj.url" alt""></div> .sea {z-index: 100;position: fixed;top: 0;text-align: center;background-colo…...
·[K8S:使用calico网络插件]:解决集群节点NotReady问题
文章目录 一:安装calico:1.1:weget安装Colico网络通信插件:1.2:修改calico.yaml网卡相关配置:1.2.1:查看本机ip 网卡相关信息:1.2.2:修改calico.yaml网卡interface相关信…...
泊松损坏图像的快速尺度间小波去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
服务器端开发-golang dlv 远程调试
1。需要root权限的服务器代码调试 sudo ./appps to get piddlv attach pid --headless --listen:40000 --api-version2 --accept-multiclientattach the golang IDE or other IDE 2。不需要root权限的服务器代码调试,另一种选择 dlv --listen:40000 --headlesstr…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
