【数据结构】实现单链表的增删查

目录

  • 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;}

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

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

相关文章

关于拓扑排序

又重新学了一下拓扑排序&#xff0c;这次发现就十分简单了&#xff0c;拓扑排序的步骤 1.他必须是一个有向无环图&#xff0c;起点我们就是入度为0的点 2.我们首先要输出的就是入度为0的点&#xff0c;然后依次删除这些点连向的点&#xff0c;使这些点的入度-1&#xff0c;如果…

Java集合数组相互转换

1.集合转换成数组 &#xff08;1&#xff09;集合a通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c;但是这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 必要时我们使用强制类型转换&#xff0c;转成我们需要的类型。 Li…

葡萄叶病害数据集

1.数据集 分成训练集和测试集 训练集有四个文件夹 第一个文件夹为 Grape Black Measles&#xff08;葡萄黑麻疹&#xff09;病害&#xff08;3783张&#xff09; Grape Black rot葡萄黑腐病病害数据集&#xff08;3596张&#xff09; Grape Healthy 健康葡萄叶&#xff08;25…

Maven项目解决cannot resolve plugin maven-deploy-plugin:2.7

导入maven项目后&#xff0c;编辑的时候提示一些插件加载失败&#xff01;大概率是你的网络有问题&#xff0c;插件下载失败。 如下图&#xff1a;&#xff08;网络突然好了&#xff0c;我想截图但是没有复现&#xff0c;用网上找到的截图代替&#xff0c;明白意思就行&#x…

Anaconda创建虚拟环境

参考文章 1 Win10RTX3060配置CUDA等深度学习环境 pytorch 管网&#xff1a;PyTorch 一 进入 Anaconda 二 创建虚拟环境 conda create -n pytorch python3.9注意要注意断 VPN切换镜像&#xff1a; 移除原来的镜像 # 查看当前配置 conda config --show channels conda config…

4-百度地图

4-百度地图 一 百度地图 1 前期准备 H5端和PC端,对接百度提供JavaScript API。 移动端,对接百度android SDK或ios SDK (1)打开百度地图开放平台 地址:https://lbsyun.baidu.com/ (2)选中开发文档——JavaScript Api 按照文档步骤开通百度开放平台并申请密钥 2 展示地…

Java多线程(四)

目录 一、线程的状态 1.1 观察线程的所有状态 1.2 线程状态和状态转移的意义 1.2.1 NEW、RUNNABLE、TERMINATED状态转换 1.2.2 WAITING、BLOCKED、TIMED_WAITING状态转换 1.2.3 yield()大公无私让出cpu 一、线程的状态 1.1 观察线程的所有状态 public class Demo9 {public st…

在linux中进行arm交叉编译体验tiny6410裸机程序开发流程

在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程&#xff0c;由于这个开发板比较老旧了&#xff0c;官方文档有很多过期的内容&#xff0c;所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…

快速开发框架若依的基础使用详解

Hi I’m Shendi 快速开发框架若依的基础使用详解 最近在为公司制作新的项目&#xff0c;经过了一段时间的技术沉淀&#xff0c;我开始尝试接触市面上用的比较多的快速开发框架&#xff0c;听的最多的当属若依吧 于是就选用了若依 介绍 为什么选&#xff1f;目的是为了提高开发…

Linux下.py文件只读问题以及解决过程

一、问题描述 如图&#xff0c;在Ubuntu Linux系统中使用pycharm管理项目文件时&#xff0c;无法编辑&#xff0c;提示文件为只读&#xff1a; 点击"OK"后仍旧无法清除只读模式&#xff0c;并报错&#xff1a; 二、问题解决 将问题定性为文件权限相关问题&#…

使用Three.js创建旋转的立方体

使用Three.js创建旋转的立方体 在本篇技术博客中&#xff0c;我们将介绍如何使用Three.js创建一个简单的场景&#xff0c;其中包含一个旋转的立方体。我们将学习如何设置场景、摄像机、立方体和渲染器&#xff0c;以及如何使用OrbitControls和gsap库来实现立方体的旋转动画和交…

VBA技术资料MF38:VBA_在Excel中隐藏公式

【分享成果&#xff0c;随喜正能量】佛祖也无能为力的四件事&#xff1a;第一&#xff0c;因果不可改&#xff0c;自因自果&#xff0c;别人是代替不了的&#xff1b;第二&#xff0c;智慧不可赐&#xff0c;任何人要开智慧&#xff0c;离不开自身的磨练&#xff1b;第三&#…

svn工具使用

svn 介绍 解决之道&#xff1a; SCM&#xff1a;软件配置管理 所谓的软件配置管理实际就是对软件源代码进行控制与管理 CVS&#xff1a;元老级产品 VSS&#xff1a;入门级产品 ClearCase&#xff1a;IBM 公司提供技术支持 SVN&#xff1a;主流产品 什么是SVN&#xff…

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像&#xff08;图生图&#xff0c;img2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、img2img生成流程1、输入图片编…

Kubernetes系列-Ingress

1 Ingress 概述 Kubernetes 对外暴露服务&#xff08;Service&#xff09;主要有两种方式&#xff1a;NodePort&#xff0c;LoadBalance&#xff0c;此外 externalIps 也可以使各类 service 对外提供服务&#xff0c;但是当集群服务很多的时候&#xff0c;NodePort方式最大的缺…

SpringBoot第28讲:SpringBoot集成MySQL - MyBatis-Plus方式

SpringBoot第28讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus方式 本文是SpringBoot第28讲&#xff0c;MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyB…

Spring框架——IOC配置文件方式

Spring框架的概述和入门 目录 Spring框架的概述和入门 什么是Spring框架 Spring框架的特点 Spring框架的IOC核心功能快速入门 Spring框架中的工厂&#xff08;了解&#xff09; Spring 创建Bean对象的三种方式 Spring框架的Bean管理的配置文件方式 Spring框架中标签的配…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者再识AutoResponder标签-上

1.简介 Fiddler充当第三者&#xff0c;主要是通过AutoResponder标签在客户端和服务端之间&#xff0c;Fiddler抓包&#xff0c;然后改包&#xff0c;最后发送。AutoResponder这个功能可以算的上是Fiddler最实用的功能&#xff0c;可以让我们修改服务器端返回的数据&#xff0c…

python面向对象

面向对象概述 python是一门面向对象语言&#xff0c;面向对象的三大特性&#xff0c;封装、继承、多态&#xff0c;python支持多继承&#xff0c;这里与java语言等还是有区别的 创建类关键字 class &#xff0c;类中包含属性和方法&#xff0c;通过类创建对象 python的类和对象…

组合模式——树形结构的处理

1、简介 1.1、概述 树形结构在软件中随处可见&#xff0c;例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等。如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形…