浅谈数据结构之链表
链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、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) - 在链表中删除节点的时间复杂度是常数。
比较单向链表、双向链表和循环链表
- 内存使用:双向链表和循环链表需要额外的空间存储前一个节点的引用,因此相较于单向链表,它们的内存消耗更大。
- 操作灵活性:双向链表在操作上更为灵活,因为它可以轻松地在节点之间进行双向遍历。循环链表允许无限循环,适用于轮流执行的场景。
链表与队列的区别
链表和队列是两种不同的数据结构,主要区别在于它们的目的和操作方式。
- 链表:链表是一种数据结构,用于表示元素之间的线性关系。它支持灵活的插入和删除操作,并且可以在任意位置添加或删除元素。
- 队列:队列是一种数据结构,用于按顺序存储和访问元素。它遵循“先进先出”(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 标注的方法如何创建对象呢? 参考文章:https://blog.csdn.net/qq_35971258/article/details/128241353 下边只讲一下 Bean 注解标注的方法,是如何去进行创建 bean,以及流程是怎样的,如果需要看源码具体执行流程&a…...
伦敦金股票代码是什么?
伦敦金是跟踪实时的现货黄金价格走势的差价合约交易,它的代码一般是LLG、GOLD,但也有一些货币交易平台会显示为XAU。伦敦金不是股票交易,因此没有四位数或六位数的股票代码,但伦敦金交易品种单一,投资者不用在数千支股…...
【环境装配】Anaconda在启动时闪现黑框,闪几次后仍能正常使用,解决黑框问题
anaconda闪黑框这个问题遇到好久了,也没找到相关资料来解决,今天做了两个更新,刚好可以不闪黑框了,记录一下。 更新anaconda 在界面右上角的位置点击更新,更新完后再打开时只闪现两个黑框了,之前好像有五…...
【Python】Python爬虫使用代理IP的实现
前言 在爬虫的过程中,我们经常会遇到需要使用代理IP的情况。比如,针对目标网站的反爬机制,需要通过使用代理IP来规避风险。因此,本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP,顾名思义&…...
盘点U-Mail邮件系统安全设计
在当今社会,电子邮件已经成企业沟通和信息传递重要的手段之一,是企业办公中不可或缺的一部分。但是由于企业邮件服务器端口对外开放、企业邮件安全管理能力不足、邮件内容敏感性高等特点,电子邮件也成为了网络攻击者进行网络钓鱼、恶意软件传…...
Webpack--动态 import 原理及源码分析
前言 在平时的开发中,我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import(),那 webpack 是如何实现 import() polyfill 的? 原理分析 我们先来看看下面的 demo function component() {const btn docume…...
创新无处不在的便利体验——基于智能视频和语音技术的安防监控系统EasyCVR
随着科技的迅猛发展,基于智能视频和语音技术的EasyCVR智能安防监控系统正以惊人的速度改变我们的生活。EasyCVR通过结合先进的视频分析、人工智能和大数据技术,为用户提供了更加智能、便利的安全保护体验,大大提升了安全性和便利性。本文将介…...
强化IP地址管理措施:确保网络安全与高效性
IP地址管理是网络安全和性能管理的关键组成部分。有效的IP地址管理可以帮助企业确保网络的可用性、安全性和高效性。本文将介绍一些强化IP地址管理的关键措施,以帮助企业提高其网络的安全性和效率。 1. IP地址规划 良好的IP地址规划是强化IP地址管理的基础。它涉及…...
Power Automate-创建审批流
提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表,再点击添加新步骤 搜索审批,点击进入 操作里的选项区别: 1)创建审批:创建一个审批任务 2)等待审批&…...
商越科技:渗透测试保障平台安全,推动线上采购高效运转
商越科技是数字化采购解决方案提供商,在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台,帮助企业实现采购数字化以及智能化转型,提高工作效率、降低采购成本。 打造数字…...
Java10新增特性
特性列表 Java 10是Java的一个主要版本更新,引入了许多新功能和改进。以下是一些Java 10的新增特性: 局部变量类型推断:Java 10引入了局部变量类型推断,允许开发者使用关键字"var"来声明局部变量,而无需指定…...
Hive 知识点八股文记录 ——(一)特性
Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差(应用于海量数据)存储、计算能力容易拓展(源于Hadoop) 支持这些特性的架构 CLI&…...
如何使用PHP替换回车为br
1、使用PHP内置的nl2br()函数 nl2br()函数是PHP内置的函数,可以将任何字符串中的回车符(\n)替换为HTML中的换行符(br)。具体使用方法如下: $string "这里有一个\n换行符"; $string nl2br($str…...
Unity 场景优化策略
Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次,从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体,例如树木或…...
Wireshark在Windows上安装后报错怎么办?
Wireshark是一个非常好的网络抓包分析工具,有了他可以轻松解决网络问题,大家有没有使用过呢? 在生产环境使用过的朋友是否各种windows系统安装时遇到各种问题?比如说缺少某某文件,我们经常的做法是找个DLL放在System32…...
【Proteus仿真】【51单片机】水质监测报警系统设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED、蜂鸣器、LCD1602、PCF8591 ADC、PH传感器、浑浊度传感器、DS18B20温度传感器、继电器模块等。 主要功能: 系统运行后&…...
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 *…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
