数据结构——链表(概念,类型,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,一经查实,立即删除!

相关文章

在 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…

git操作(Windows中GitHub)

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

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 操作尖括号…

强推未发表!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;后端服务未配…

【游戏设计原理】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项目 …

Ubuntu离线docker compose安装DataEase 2.10.4版本笔记

1、先准备一个可以正常上网的相同版本的Ubuntu系统&#xff0c;可以使用虚拟机。Ubuntu系统需要安装好docker compose或docker-compose 2、下载dataease-online-installer-v2.10.4-ce.tar在线安装包&#xff0c;解压并执行install.sh进行安装和启动 3、导出docker镜像 sudo d…

【报错解决】Sql server 2022连接数据库时显示证书链是由不受信任的颁发机构颁发的

SSMS 20在连接Sql server 2022数据库时有如下报错&#xff1a; A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。 原因是尝试使…

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…

【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-dio版本(31 /100)

动图更精彩 dio & http 在Flutter中&#xff0c;dio和http是两个常用的HTTP请求库&#xff0c;它们各有优缺点。以下是对这两个库的详细对比&#xff1a; 功能特性 http&#xff1a; 功能&#xff1a;提供了基本的HTTP请求和响应功能&#xff0c;如GET、POST、PUT、DELE…

递归40题!再见递归

简介&#xff1a;40个问题&#xff0c;有难有易&#xff0c;均使用递归完成&#xff0c;需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数&#xff0c;求该整数中每个数字出现的次数。 输入&#xff1a;19931003 输出&#xf…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数&#xff08;中断中恢复&#xff09; 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend()&#xff1a;挂起任务, 类似暂停&#xff0c;可恢复 vTaskResume()&#xff1a…

openharmony标准系统方案之瑞芯微RK3568移植案例

标准系统方案之瑞芯微RK3568移植案例 ​本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c…