当前位置: 首页 > news >正文

浅谈数据结构之链表

链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、Java实现方式、使用场景,同时比较它们的不同之处。我们还会介绍链表与队列之间的区别。

单向链表

定义

单向链表是由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。链表的头节点指向第一个节点,而最后一个节点的指针指向空值(null)。

Java实现

以下是使用Java实现单向链表的简单示例:

public class ListNode {int data;ListNode next;public ListNode(int data) {this.data = data;this.next = null;}
}public class LinkedList {ListNode head;public LinkedList() {this.head = null;}// 添加节点到链表尾部public void append(int data) {ListNode newNode = new ListNode(data);if (head == null) {head = newNode;return;}ListNode current = head;while (current.next != null) {current = current.next;}current.next = newNode;}
}

双向链表

定义

双向链表是单向链表的扩展,每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。这使得在双向链表中,可以在节点之间双向移动。

Java实现

以下是使用Java实现双向链表的简单示例:

public class DoubleListNode {int data;DoubleListNode prev;DoubleListNode next;public DoubleListNode(int data) {this.data = data;this.prev = null;this.next = null;}
}public class DoublyLinkedList {DoubleListNode head;public DoublyLinkedList() {this.head = null;}// 在链表头部插入节点public void prepend(int data) {DoubleListNode newNode = new DoubleListNode(data);if (head != null) {head.prev = newNode;}newNode.next = head;head = newNode;}
}

循环链表

定义

循环链表是一种特殊形式的链表,其中最后一个节点的指针指向链表的头部,形成一个循环。这使得链表可以无限循环下去。

Java实现

以下是使用Java实现循环链表的简单示例:

public class CircularListNode {int data;CircularListNode next;public CircularListNode(int data) {this.data = data;this.next = null;}
}public class CircularLinkedList {CircularListNode head;public CircularLinkedList() {this.head = null;}// 添加节点到循环链表尾部public void append(int data) {CircularListNode newNode = new CircularListNode(data);if (head == null) {head = newNode;head.next = head;  // 将最后一个节点的指针指向头部,形成循环return;}CircularListNode current = head;while (current.next != head) {current = current.next;}current.next = newNode;newNode.next = head;}
}

使用场景

单向链表

  • 资源共享:单向链表可用于实现多个部分之间的资源共享,其中每个节点表示一个资源。
  • 缓存实现:单向链表可用于实现缓存,其中新数据可以在链表的头部迅速插入,而最久未使用的数据则可以在链表尾部删除。

双向链表

  • 前后导航:双向链表允许在节点之间前后导航,使其适用于需要双向遍历的场景,如文本编辑器的光标移动。
  • LRU缓存:双向链表可用于实现LRU(Least Recently Used)缓存,其中最近访问的数据位于链表的头部,而最久未使用的数据位于链表尾部。

循环链表

  • 轮流执行:循环链表可用于轮流执行任务,如操作系统中的进程调度。
  • 循环队列:循环链表可以用于实现循环队列,如生产者-消费者模型中的任务调度。

时间复杂度

单向链表、双向链表和循环链表

  • 访问(Access) :O(n) - 在链表中查找特定节点的时间复杂度是线性的。
  • 插入(Insertion) :O(1) - 在链表中插入节点的时间复杂度是常数。
  • 删除(Deletion) :O(1) - 在链表中删除节点的时间复杂度是常数。

比较单向链表、双向链表和循环链表

  1. 内存使用:双向链表和循环链表需要额外的空间存储前一个节点的引用,因此相较于单向链表,它们的内存消耗更大。
  2. 操作灵活性:双向链表在操作上更为灵活,因为它可以轻松地在节点之间进行双向遍历。循环链表允许无限循环,适用于轮流执行的场景。

链表与队列的区别

链表和队列是两种不同的数据结构,主要区别在于它们的目的和操作方式。

  • 链表:链表是一种数据结构,用于表示元素之间的线性关系。它支持灵活的插入和删除操作,并且可以在任意位置添加或删除元素。
  • 队列:队列是一种数据结构,用于按顺序存储和访问元素。它遵循“先进先出”(FIFO)原则,即最早入队的元素将最早出队。

在队列中,元素只能在队尾入队,在队头出队。而链表则允许在任意位置插入或删除元素。虽然队列可以使用链表实现,但它们是两个不同的概念,适用于不同的应用场景。

总结

链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。单向链表适用于简单的前后遍历场景,而双向链表在需要前后导航和更复杂的应用场景中表现出色。循环链表允许无限循环,适用于需要轮流执行任务的场景。链表的实现相对简单,它在访问、插入和删除方面具有良好的性能。链表与队列有相似之处,但它们在目的和操作方式上有明显的区别。了解链表的不同形式以及它们的应用和性能特点,有助于更好地选择和使用这一重要的数据结构。

相关文章:

浅谈数据结构之链表

链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、Java实现方式、使用场景,同时比较它们的不同之处。我们还会介绍链表与队列之间的区别。 单向链表 定义…...

封装一个 虚拟列表渲染 组件

组件代码 <template><div ref"list" class"infinite-list-container" scroll"scrollEvent($event)"><div class"infinite-list-phantom" :style"{ height: listHeight px }"></div><div class…...

Spring中@Bean标注的方法是如何创建对象呢?

Bean 标注的方法如何创建对象呢&#xff1f; 参考文章&#xff1a;https://blog.csdn.net/qq_35971258/article/details/128241353 下边只讲一下 Bean 注解标注的方法&#xff0c;是如何去进行创建 bean&#xff0c;以及流程是怎样的&#xff0c;如果需要看源码具体执行流程&a…...

伦敦金股票代码是什么?

伦敦金是跟踪实时的现货黄金价格走势的差价合约交易&#xff0c;它的代码一般是LLG、GOLD&#xff0c;但也有一些货币交易平台会显示为XAU。伦敦金不是股票交易&#xff0c;因此没有四位数或六位数的股票代码&#xff0c;但伦敦金交易品种单一&#xff0c;投资者不用在数千支股…...

【环境装配】Anaconda在启动时闪现黑框,闪几次后仍能正常使用,解决黑框问题

anaconda闪黑框这个问题遇到好久了&#xff0c;也没找到相关资料来解决&#xff0c;今天做了两个更新&#xff0c;刚好可以不闪黑框了&#xff0c;记录一下。 更新anaconda 在界面右上角的位置点击更新&#xff0c;更新完后再打开时只闪现两个黑框了&#xff0c;之前好像有五…...

【Python】Python爬虫使用代理IP的实现

前言 在爬虫的过程中&#xff0c;我们经常会遇到需要使用代理IP的情况。比如&#xff0c;针对目标网站的反爬机制&#xff0c;需要通过使用代理IP来规避风险。因此&#xff0c;本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP&#xff0c;顾名思义&…...

盘点U-Mail邮件系统安全设计

在当今社会&#xff0c;电子邮件已经成企业沟通和信息传递重要的手段之一&#xff0c;是企业办公中不可或缺的一部分。但是由于企业邮件服务器端口对外开放、企业邮件安全管理能力不足、邮件内容敏感性高等特点&#xff0c;电子邮件也成为了网络攻击者进行网络钓鱼、恶意软件传…...

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…...

创新无处不在的便利体验——基于智能视频和语音技术的安防监控系统EasyCVR

随着科技的迅猛发展&#xff0c;基于智能视频和语音技术的EasyCVR智能安防监控系统正以惊人的速度改变我们的生活。EasyCVR通过结合先进的视频分析、人工智能和大数据技术&#xff0c;为用户提供了更加智能、便利的安全保护体验&#xff0c;大大提升了安全性和便利性。本文将介…...

强化IP地址管理措施:确保网络安全与高效性

IP地址管理是网络安全和性能管理的关键组成部分。有效的IP地址管理可以帮助企业确保网络的可用性、安全性和高效性。本文将介绍一些强化IP地址管理的关键措施&#xff0c;以帮助企业提高其网络的安全性和效率。 1. IP地址规划 良好的IP地址规划是强化IP地址管理的基础。它涉及…...

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表&#xff0c;再点击添加新步骤 搜索审批&#xff0c;点击进入 操作里的选项区别&#xff1a; 1&#xff09;创建审批&#xff1a;创建一个审批任务 2&#xff09;等待审批&…...

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商&#xff0c;在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台&#xff0c;帮助企业实现采购数字化以及智能化转型&#xff0c;提高工作效率、降低采购成本。 打造数字…...

Java10新增特性

特性列表 Java 10是Java的一个主要版本更新&#xff0c;引入了许多新功能和改进。以下是一些Java 10的新增特性&#xff1a; 局部变量类型推断&#xff1a;Java 10引入了局部变量类型推断&#xff0c;允许开发者使用关键字"var"来声明局部变量&#xff0c;而无需指定…...

Hive 知识点八股文记录 ——(一)特性

Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差&#xff08;应用于海量数据&#xff09;存储、计算能力容易拓展&#xff08;源于Hadoop&#xff09; 支持这些特性的架构 CLI&…...

如何使用PHP替换回车为br

1、使用PHP内置的nl2br()函数 nl2br()函数是PHP内置的函数&#xff0c;可以将任何字符串中的回车符&#xff08;\n&#xff09;替换为HTML中的换行符&#xff08;br&#xff09;。具体使用方法如下&#xff1a; $string "这里有一个\n换行符"; $string nl2br($str…...

Unity 场景优化策略

Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次&#xff0c;从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体&#xff0c;例如树木或…...

Wireshark在Windows上安装后报错怎么办?

Wireshark是一个非常好的网络抓包分析工具&#xff0c;有了他可以轻松解决网络问题&#xff0c;大家有没有使用过呢&#xff1f; 在生产环境使用过的朋友是否各种windows系统安装时遇到各种问题&#xff1f;比如说缺少某某文件&#xff0c;我们经常的做法是找个DLL放在System32…...

【Proteus仿真】【51单片机】水质监测报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、PCF8591 ADC、PH传感器、浑浊度传感器、DS18B20温度传感器、继电器模块等。 主要功能&#xff1a; 系统运行后&…...

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…...

flink1.18.0 sql-client报错

报错 Flink SQL> > > select * from t1; [ERROR] Could not execute SQL statement. Reason: java.lang.ClassNotFoundException: org.apache.kafka.clients.consumer.OffsetResetStrategy 解决 注意 一定要重启flink服务 否则还会报错: Flink SQL> select *…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...