【数据结构】从链表到LinkedList类

在这里插入图片描述
🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈
🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈🎈🎈
🧧🧧🧧🧧🧧上一篇文章:从顺序表到ArrayList类🎈🎈🎈🎈🎈

文章目录

  • 1.前言
    • 2.链表
    • 2.1 链表的概念及结构
    • 2.2链表的组合
    • 2.3链表的实现
    • 2.4LinkedList的模拟实现
      • 3.ArrayList和LinkedList的区别

1.前言

上一篇文章我们了解ArrayList表的使用,并且模拟了ArrayList表,通过数组的方式来存储数据单元。其底层是一块连续储存的空间,这时候我们发现当我们去插入数据或者删除数据的时候,需要将前后的数据整体向前移动或者向后移动。因此ArrayList是不能满足我们的需求。接下来我们可以来看看即将要学的LinkedList表。

2.链表

2.1 链表的概念及结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。结构像我们平时坐的交通工具火车一样,一节一节的,并不是按一定的顺序链接的,车厢可以随意链接,链表也是这样的。
在这里插入图片描述
在这里插入图片描述
注意:
1.从图中可以看出,链式结构不一定在物理上是连续的空间,但在逻辑上是连续的空间。
2.现实中的结点一般都是在堆上申请出来的。
3。在堆上申请的空间,是按定一定的规则来分配的,两次申请的空间可能是连续的空间,也有可能不是连续的空间。

2.2链表的组合

在现实当中有很多种的链表,有分单向和双向,带头和不带头,循环和不循环,总共有八种组合方式:
1.单向带头循环
在这里插入图片描述
2.单向带头不循环
在这里插入图片描述
3.单向不带头循环
在这里插入图片描述
4.单向不带头不循环
在这里插入图片描述
5.双向带头循环
在这里插入图片描述
6.双向带头不循环
在这里插入图片描述
7.双向不带头循环
在这里插入图片描述
8.双向不带头不循环
在这里插入图片描述
这么多种类型的链表,我们只了解两种单向不带头不循环和双向不带头不循环。
单向不带头不循环:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。
双向不带头不循环:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

2.3链表的实现

2.3.1头插法

public void addFirst(int data) {ListNode node = new ListNode(data);//如果没有节点,直接将head标记放在要插的节点上,作为第一个首节点if(head == null) {this.head = node;}else {//先绑定,再移标记引用变量node.next = this.head;this.head = node;}}

2.3.2尾插法

public void addLast(int data) {ListNode node = new ListNode(data);//如果没有节点,直接将head标记放在要插的节点上,作为第一个尾节点if(head == null) {this.head = node;}else {ListNode cur = head;while(cur.next != null) {cur = cur.next;}cur.next = node;}}

2.3.3任意位置插入,第一个数据节点为0号下标

public void addIndex(int index, int data) {//判断index是否合法if(index < 0 || index > size()) {throw new IndexException("坐标"+index+":位置不合法");}ListNode node = new ListNode(data);//1.如果从头插入,直接头插法if(index == 0) {addFirst(data);}//2.从中间插ListNode cur = searchPrevIndex(index);node.next = cur.next;cur.next = node;}//创建一个找前驱的方法private ListNode searchPrevIndex(int index) {ListNode cur = head;int count = 0;while(count < index-1) {cur = cur.next;count++;}return cur;}

2.3.4查找是否包含关键字key是否在单链表当中

public boolean contains(int key) {ListNode cur = head;while(cur != null) {if(key == cur.value) {return true;}cur = cur.next;}return false;}

2.3.5删除第一次出现关键字为key的节点

public void remove(int key) {//删除头节点if(head.value == key) {head = head.next;return;}//1.找到要删除key的前驱ListNode cur = searchPrevKey(key);if(cur == null) {return;//没有你要删除的key}//2.定义一个标记curNextListNode curNext = cur.next;//3.删除keycur.next = curNext.next;}private ListNode searchPrevKey(int key) {ListNode cur = head;while(cur.next != null) {if(cur.next.value == key) {return cur;}else {cur = cur.next;}}return null;}

2.3.6删除所有值为key的节点(非循环方法)

public void removeAllKeye(int key) {ListNode prev = head;ListNode cur = head.next;while (cur != null) {if(cur.value == key) {prev.next = cur.next;cur = cur.next;}else {prev = cur;cur = cur.next;}}//删除头节点if(head.value == key) {head = head.next;}}

2.3.7得到单链表的长度

public int size() {ListNode cur =head;int count = 0;while(cur != null) {cur = cur.next;count++;}return count;}

2.3.8清空链表

 public void clear() {head = null;}
}

2.4LinkedList的模拟实现

** 2.4。1头插法**

public void addFirst(int data) {ListNode node = new ListNode(data);//如果链表为空if(head == null) {head = node;last = node;}else {//链表不为空node.next = head;head.prev = node;node.prev = null;head = node;}}

** 2.4。2尾插法**

public void addLast(int data) {ListNode node = new ListNode(data);//如果链表为空if(head == null) {head = node;last = node;}else {//链表不为空last.next = node;node.prev = last;node.next = null;last = node;}}

** 2.4.3任意位置插入,第一个数据节点为0号下标**

public void addIndex(int index, int data) {//先判断index合不合法if(index<0 || index >size()) {throw new IndexException("位置不合法:"+index);}//1.从头插入,头插法if(index == 0) {addFirst(data);return;}//2.从尾插,尾插法if(index == size()) {addLast(data);return;}//3.从中间插//找要插入的位置ListNode cur = findAddIndex(index);ListNode node = new ListNode(data);node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}private ListNode findAddIndex(int index) {ListNode cur = head;while(index != 0) {cur = cur.next;index--;}return cur;}

** 2.4.4查找是否包含关键字key是否在单链表当中**

public boolean contains(int key) {ListNode cur = head;while(cur != null) {if(cur.value == key) {return true;}else {cur = cur.next;}}return false;}

** 2.4.5删除第一次出现关键字为key的节点**

 public void remove(int key) {ListNode cur = head;while (cur != null) {if(cur.value == key) {if(cur == head) {//删除头节点head = head.next;if(head != null) {head.prev = null;}else {//只有一个节点 且是需要删除的节点last = null;}}else {//删除中间节点if(cur.next != null) {cur.next.prev = cur.prev;cur.prev.next = cur.next;}else {//删除尾巴节点cur.prev.next = cur.next;last = last.prev;}}return;}cur = cur.next;}}

** 2.4.6删除所有值为key的节点**

 public void removeAllKeye(int key) {ListNode cur = head;while (cur != null) {if(cur.value == key) {if(cur == head) {head = head.next;if(head != null) {head.prev = null;}else {//只有一个节点 且是需要删除的节点last = null;}}else {//删除中间节点if(cur.next != null) {cur.next.prev = cur.prev;cur.prev.next = cur.next;}else {//删除尾巴节点cur.prev.next = cur.next;last = last.prev;}}}cur = cur.next;}}

** 2.4.7得到双链表的长度**

public int size() {ListNode cur = head;int count = 0;while(cur != null) {count++;cur = cur.next;}return count;}

** 2.4.8清除链表**

public void clear() {head =null;last =null;}

3.ArrayList和LinkedList的区别

在这里插入图片描述
结尾:
希望大家可以给我点点关注,点点赞,你们的支持就是我的最大鼓励。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

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

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

相关文章

标准库中的String类 String(C++)【2】

文章目录 String常用的接口&#xff08;黑框标记的是常用接口&#xff09;string类对象的反向遍历操作第一种第二种 容量string的扩容机制 String常用的接口&#xff08;黑框标记的是常用接口&#xff09; string类对象的反向遍历操作 第一种 通过下表进行遍历 void TestSt…

springboot226经方药食两用服务平台

经方药食两用服务平台的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定经方药食两用…

RK3568平台 RTC时间框架

一.RTC时间框架概述 RTC&#xff08;Real Time Clock&#xff09;是一种用于计时的模块&#xff0c;可以是再soc内部&#xff0c;也可以是外部模块。对于soc内部的RTC&#xff0c;只需要读取寄存器即可&#xff0c;对于外部模块的RTC&#xff0c;一般需要使用到I2C接口进行读取…

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root&#xff08;God用户类似LINUX的root&#xff09; 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…

(2024,Sora 逆向工程,DiT,LVM 技术综述)Sora:大视觉模型的背景、技术、局限性和机遇回顾

Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎&#xff0c;最初于2012年发布&#xff0c;并在2013年成为Apache项目的一部分&#xff1b;Presto 作为现在在企业中流行使用的即席查询框架&#x…

求字符串所有整数最小和 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 1.输入字符串s输出s中包含所有整数的最小和&#xff0c;说明&#xff1a;1字符串s只包含a~z,A~Z,,-&#xff0c; 2.合法的整数包括正整数&#xff0c;一个或者多…

C 嵌入式系统设计模式 13:中断模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之六&…

跨境电商与支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…

flask知识--01

flask介绍 # python 界的web框架&#xff1a; Django&#xff1a;大而全&#xff0c;使用率较高 &#xff1a;https://github.com/django/django -FastAPI&#xff1a;新项目选择使用它&#xff1a;https://github.com/tiangolo/fastapi -flask&#xff1a;公司一些…

Mysterious-GIF-攻防世界-MISC

题目简介&#xff1a; 下载得到gif文件&#xff0c;十六进制编辑器查看&#xff0c;发现末尾有50 4B 03 04文件头。提取后保存为zip文件。 解压该zip文件&#xff0c;得到temp.zip。十六进制编辑器查看temp.zip&#xff0c;会发现有多个文件头和文件尾。 用binwalk分离temp.zi…

如何在windows系统部署Lychee网站,并结合内网穿透打造个人云图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

接口测试的测试要点

接口测试的测试要点&#xff0c;你知道都有哪些吗&#xff1f; 接口测试是软件测试中的重要组成部分&#xff0c;它的目的是评估接口的质量和可靠性&#xff0c;以保证系统的正常运行。在进行接口测试时&#xff0c;必须要考虑到以下几个方面&#xff1a; 测试用例的编写 测试…

ts的重载

官网示例 这里大概理解是 T 继承了Number|sting 加上&#xff1f;条件判断就是 T继承Number|sting 部分为true 没有继承部分为false&#xff0c; 就是输入string, 为true, 输入 null 则为false, type Exclude<T, U> T extends U ? never : T; // 相当于: type A …

CS_上线三层跨网段机器(完整过程还原)

以前讲过用cs_smb_beacon上线不出网机器&#xff0c;但是真实的网络拓扑肯定不止这么一层的网络&#xff01; 所以我就来搭建一个复杂一点的网络环境&#xff01;&#xff01; 当然了&#xff0c;这三台电脑之间都是不同的网段&#xff0c;&#xff08;但是同属于一个域环境&a…

golang学习7,glang的web的restful接口结构体传参

接口&#xff1a; //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…

Qt6.8 GRPC功能使用(2)标准 Qt实现客户端

简介 基于之前的文章所说&#xff0c; Qt6.7之后才开始支持客户端、服务端、及双向流&#xff0c;恰好电脑需要重装&#xff0c;看到Qt6.8版本就直接安装了&#xff0c;内容也是使用Qt6.8的版本进行编译的 客户端实现步骤 1. 安装Qt6.8, 包含GRPC功能模块 Qt 6.8安装目录下包…

5G网络介绍

目录 一、网络部署模式 二、4/5G基站网元对标 三、4/5G系统架构对比 四、5G核心单元 五、边缘计算 六、轻量化&#xff08;UPF下沉&#xff09; 方案一&#xff1a;UPF下沉 方案二&#xff1a;UPF下沉 方案三&#xff1a;5GC下沉基础模式 方案四&#xff1a;…

05 动力云客之分页查询用户 + 查询用户详情 + 新增用户

1. 用户列表分页查询实现 核心 使用pageHelper实现分页 GetMapping(value "api/users")//分页的参数可以不传, 不传就默认设置为1public R userPage(RequestParam(value "current", required false) Integer current) {if (current null) {current …

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …