数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研)
记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结+网上借鉴)
希望大家能一起发现问题和补充,也欢迎讨论👏👏👏

文章目录

  • 链表
    • 链表介绍
    • 链表类型
      • 1. 单向链表
      • 2. 双向链表
      • 3. 循环链表
    • 链表实现(增删改查)
      • 链表节点
      • 插入节点
      • 删除节点
    • 链表的特点与优势👍
    • 链表的缺点👎

链表

链表介绍

链表(Linked List)是一种线性数据结构,它由一系列节点(Node)组成,每个节点包含两部分:一部分用于存储元素(数据域),另一部分是包含指向列表中下一个节点的引用(指针域)

img

基本概念:

  • 节点(Node):链表的基本单位,由数据域和一个或多个指针域组成。
  • 头结点(Head Node):指向链表第一个节点的引用。对于空链表,头结点为null
  • 尾结点(Tail Node):链表中最后一个节点,它的指针域通常为null(对于非循环链表)。

链表类型

1. 单向链表

  • 每个节点只包含一个指向前驱节点或后继节点的指针。
  • 优点是结构简单,节省空间;缺点是从任意节点只能朝一个方向遍历。

img

2. 双向链表

  • 每个节点包含两个指针,分别指向前驱节点和后继节点。
  • 支持双向遍历,方便在链表中前后移动,但需要额外的空间来存储第二个指针。

img

3. 循环链表

  • 尾结点的指针不是指向null,而是指回链表的第一个节点,形成一个环。
  • 可以是单向循环链表或双向循环链表,适用于某些特定的应用场景,如实现循环队列。

img

链表实现(增删改查)

以双向链表为例

img

链表节点

private static class Node<E> {E item; // 存储的元素Node<E> next; // 指向下一个节点Node<E> prev; // 指向前一个节点Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}
  • 使用泛型来表示存储在节点中的数据可以是任何对象
  • nextprev指向对象都是Node

插入节点

  • 头插:
private void linkFirst(E e) {final Node<E> f = first;final Node<E> newNode = new Node<>(null, e, f);first = newNode;if (f == null)last = newNode;elsef.prev = newNode;size++;modCount++;
}
  1. 先记录头节点
  2. 创建新节点,并且新节点的prev指向nullnext指向头节点
  3. 判断头节点是否为空

​ a. 若为空,则原来没有节点,设置尾节点也为该新节点

​ b. 否则头节点的prev指向新节点

  1. sizemodCount都加一

img

  • 尾插:
void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;
}

和头插法几乎同理。

img

删除节点

unlink操作:

E unlink(Node<E> x) {// assert x != null;  // 断言:确保传入的节点不为null(注释掉了)final E element = x.item;  // 保存要移除节点的数据元素final Node<E> next = x.next;  // 获取要移除节点的下一个节点引用final Node<E> prev = x.prev;  // 获取要移除节点的上一个节点引用if (prev == null) {  // 如果要移除的是头结点first = next;  // 更新头结点指向下一个节点(即新的头结点)} else {  // 如果不是头结点prev.next = next;  // 将前一个节点的next指针指向当前节点的下一个节点x.prev = null;  // 断开当前节点与前一个节点的链接}if (next == null) {  // 如果要移除的是尾结点last = prev;  // 更新尾结点指向前一个节点(即新的尾结点)} else {  // 如果不是尾结点next.prev = prev;  // 将下一个节点的prev指针指向前一个节点x.next = null;  // 断开当前节点与下一个节点的链接}x.item = null;  // 清空当前节点的数据域size--;  // 减少链表大小计数器modCount++;  // 增加修改计数器,用于迭代器检测并发修改return element;  // 返回被移除节点的数据元素
}

remove操作:

public boolean remove(Object o) {// 如果要移除的元素为null,则特别处理if (o == null) {for (Node<E> x = first; x != null; x = x.next) { // 遍历链表if (x.item == null) { // 查找值为null的节点unlink(x); // 移除找到的第一个null节点return true; // 成功移除后返回true}}} else {for (Node<E> x = first; x != null; x = x.next) { // 遍历链表if (o.equals(x.item)) { // 使用equals方法查找匹配的节点unlink(x); // 移除找到的第一个匹配节点return true; // 成功移除后返回true}}}return false; // 如果没有找到匹配项则返回false
}

img

链表的特点与优势👍

  • 动态大小:不像数组那样需要预先分配固定大小的内存空间,链表可以根据需要动态地增长或收缩。
  • 插入和删除效率高:一旦找到要操作的位置,插入或删除只需要改变相关节点之间的链接,而不需要像数组那样移动大量元素。
  • 不连续存储:由于节点之间通过指针连接,因此它们不必存放在连续的内存位置上,这使得内存使用更加灵活。

链表的缺点👎

  • 随机访问效率低:为了访问某个节点,通常需要从头结点开始逐个遍历,直到到达目标节点,这使得随机访问的时间复杂度为O(n)。
  • 额外的内存开销:每个节点除了存储实际的数据外,还需要额外的内存来存储指针。

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

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

相关文章

app版本控制java后端接口版本管理

java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…

LRU 算法详解与 Java 的两种实现方式

LRU 算法详解与 Java 的两种实现方式 LRU 算法详解与 Java 的两种实现方式一、LRU 算法简介二、LRU 算法原理三、LRU 算法应用场景四、Java 实现 LRU 算法(一)基于 LinkedHashMap 实现(二)基于双向链表和 HashMap 实现五、总结LRU 算法详解与 Java 的两种实现方式 一、LRU…

基于 Python 的财经数据接口库:AKShare

AKShare 是基于 Python 的财经数据接口库&#xff0c;目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具&#xff0c;主要用于学术研究目的。 安装 安装手册见…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容&#xff0c;MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令&#xff0c;你需要找到 mysql 可执行文件的路径。 在 macOS 上&#xff0c;mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此&#xff0c;完整的路径应该是&#xff1…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

通过外部链接启动 Flutter App(详细介绍及示例)

通过外部链接启动 Flutter App&#xff08;firebase_dynamic_links 和 app_links&#xff09; 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中&#xff0c;经常有点击链接启动并进入APP的需求&#xff08;如果未安装跳转到应用商店&#xff09;。Android通…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

MySQL DCL 数据控制

文章目录 1.新建用户2.删除用户3.用户授权4.撤销用户权限5.查看用户权限6.修改用户密码7.权限类型参考文献 1.新建用户 连接到 MySQL 服务器后&#xff0c;管理员或特权用户可以使用 CREATE USER 语句创建新用户。 CREATE USER usernamehost IDENTIFIED BY password;-- 示例 …

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程&#xff0c;其中一个实例是讲如何爬取淘宝商品信息&#xff0c;现整理如下&#xff1a; 功能描述&#xff1a;获取淘宝搜索页面的信息&#xff0c;提取其中的商品名称和价格 探讨&#xff1a;淘宝的搜索接口 翻页的处理 技术路线:requests…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7&#xff1a;Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

深度学习 Pytorch 张量的索引、分片、合并以及维度调整

张量作为有序的序列&#xff0c;也是具备数值索引的功能&#xff0c;并且基本索引方法和python原生的列表、numpy中的数组基本一致。 不同的是&#xff0c;pytorch中还定义了一种采用函数来进行索引的方式。 作为pytorch中的基本数据类型&#xff0c;张量既具备了列表、数组的基…

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展&#xff0c;越来越多的卖家开始尝试使用云手机来协助他们的业务&#xff0c;这是因为云手机具有许多优势。那么&#xff0c;具体来说&#xff0c;跨境电商使用云手机可以做哪些事情呢&#xff1f; &#xff08;一&#xff09;实现多账号登录和管理 跨境电商…

一体机cell服务器更换内存步骤

一体机cell服务器更换内存步骤&#xff1a; #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…

“AI开放式目标检测系统:开启智能识别新时代

嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊一个超酷炫的技术——AI开放式目标检测系统。这可不是什么高大上、遥不可及的玩意儿&#xff0c;它已经悄悄地走进了我们的生活&#xff0c;改变着我们对世界的认知和互动方式呢。 先来说说&#xff0c;什么是AI开放式目标检测系…

【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结

问题背景 项目架构为前后端分离的微服务架构&#xff1a; 前端部署在 8000 端口API 网关部署在 9000 端口后端服务包括&#xff1a; api-backend (9001端口)api-interface (9002端口) 初始状态&#xff1a; 前端已配置 HTTPS&#xff08;端口 8000&#xff09;后端服务未配…

csp-j知识点:联合(Union)的基本概念

一、联合&#xff08;Union&#xff09;的基本概念 联合是C/C语言中一种特殊的数据结构&#xff0c;它的主要特点是所有成员共享同一块内存空间。这意味着在任何给定时刻&#xff0c;联合中只有一个成员是有效的&#xff0c;因为它们都占用相同的物理内存位置。联合的大小取决…

【游戏设计原理】68 - 玩家错误

一、错误类型 玩家错误类型 行为错误&#xff08;performance errors&#xff09;和运动控制错误&#xff08;motor control errors&#xff09;是玩家在游戏中常犯的错误。 运动控制错误 错误发生在玩家协调或掌握输入设备时&#xff0c;可能包括不小心按错键或未能及时把握战…

2.使用Spring BootSpring AI快速构建AI应用程序

Spring AI 是基于 Spring Boot3.x 框架构建&#xff0c;Spring Boot官方提供了非常便捷的工具Spring Initializr帮助开发者快速的搭建Spring Boot应用程序,IDEA也集成了此工具。本文使用的开发工具IDEASpring Boot 3.4Spring AI 1.0.0-SNAPSHOTMaven。 1.创建Spring Boot项目 …