【数据结构】从链表到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…

计算机网络期末复习笔记

一、引言 计算机网络是现代信息技术的核心&#xff0c;涉及计算机、通信、电子等多个领域。在信息时代&#xff0c;计算机网络已经深入到人们生活的各个方面&#xff0c;如社交、购物、教育、科研等。因此&#xff0c;理解和掌握计算机网络的基本概念和原理&#xff0c;对于计…

springboot226经方药食两用服务平台

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

Redis、Memcache、MongoDB三者区别?

使用Redis、Memcache和MongoDB这些工具或数据库取决于具体的需求和应用场景。每种技术都有自己的优势和适用范围。 Redis&#xff1a; 高性能的内存存储&#xff1a;Redis是一个基于内存的数据存储系统&#xff0c;因此读取和写入速度非常快。 丰富的数据结构支持&#xff1a…

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…

Python全栈工程师课件教程

【百战程序员】Python全栈工程师 描述&#xff1a;Python 被广泛应用于数据分析、机器学习以及 Web 开发等领域&#xff0c;尤其是近些年人工智能的发展更加助推了 Python 的火热程度。 学习 Python 是非科班出身进入程序员岗位的选择。课程体系全新升级&#xff0c;满足学员提…

【华为面试基础题】5键键盘的输出

描述 有一个特殊的 5键键盘&#xff0c;上面有 a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。 a键在屏幕上输出一个字母 a; ctrl-c将当前选择的字母复制到剪贴板; ctrl-x将当前选择的 字母复制到剪贴板&#xff0c;并清空选择的字母; ctrl-v将当前剪贴板里的字母输出到屏幕; ctrl-a …

求字符串所有整数最小和 - 华为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…

Springboot项目实战

文章目录 SpringBootVue后台管理系统所需软件下载、安装、版本查询 *Spring项目项目架构 SpringBootVue后台管理系统 学习视频&#xff1a; https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from333.337.search-card.all.click&vd_sourcec901ae3ff497a02016ba7bada…

如何在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; 测试用例的编写 测试…

ES6 Function 面试题

ES6 Function 面试题 1. 请解释一下箭头函数的特点和使用场景。 答案&#xff1a; 箭头函数是 ES6 中新增的一种函数声明方式。它具有以下特点&#xff1a; 箭头函数中的 this 始终指向其定义时所在的上下文。箭头函数不能被用作构造函数&#xff0c;也无法通过 new 运算符…

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 …