浅谈数据结构之链表
链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、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 *…...
不止于分频:用FPGA实现一个可配置的N分频模块(支持奇偶,含Testbench)
可配置N分频模块的FPGA工程实践:从参数化设计到验证闭环 在FPGA开发中,时钟管理就像乐队的指挥,协调着各个外设模块的节奏。想象一下这样的场景:你的设计需要同时驱动UART(115200波特率)、I2C(4…...
别再乱删了!深入理解Adobe正版服务(AGSService)运行机制与安全移除指南
深入解析Adobe正版服务运行机制与安全处置方案 当你在深夜赶稿时突然弹出的红色警告窗口打断了创作流程,或是重要演示前跳出的正版验证提示打乱了节奏——这些由Adobe Genuine Software Integrity Service(简称AGSService)引发的突发状况&…...
魔兽争霸3智能优化革命:一键解锁极致游戏体验
魔兽争霸3智能优化革命:一键解锁极致游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏在现代硬件上表现不佳而烦恼吗…...
测试22222222
测试...
MySQL在云环境如何选择存储类型_SSD与高性能云盘配置建议
绝大多数业务用高性能云盘就够了,SSD云盘仅适用于实时风控等高并发写入、低延迟敏感场景;高性能云盘提供稳定IOPS基线与突发能力,而SSD云盘IOPS波动大、延迟不可控。云上 MySQL 用 SSD 还是高性能云盘?看 IOPS 和延迟需求直接说结…...
向量搜索误召回率高达38%?EF Core 10中Normalize预处理缺失、余弦阈值漂移、HNSW参数过拟合三重危机预警
第一章:EF Core 10向量搜索扩展的危机本质与演进定位向量搜索在ORM生态中的结构性张力 EF Core 10首次将向量搜索能力纳入官方实验性扩展(Microsoft.EntityFrameworkCore.Vector),但其设计并未突破传统ORM“关系—对象”映射范式的…...
成本敏感决策树解决不平衡分类问题
1. 项目概述:不平衡分类问题的成本敏感决策树在真实世界的数据分析场景中,我们常常会遇到类别分布严重不平衡的分类问题。比如金融欺诈检测中正常交易占99%、欺诈交易仅1%,医疗诊断中健康样本远多于患病样本。传统决策树算法如ID3、C4.5、CAR…...
LangChain怎么换大模型?3步免费切换OpenAI/DeepSeek/Qwen全教程(2026 全新切换配置教程 全程避坑,亲测有效)
一、为什么需要切换大模型?LangChain 的核心价值解析 1.1 大模型生态的碎片化现状 当前大模型市场呈现 “百花齐放,协议割裂” 的局面: OpenAI:GPT 系列(闭源),API 协议成为事实标准国产模型…...
大模型 Agent 开发的本质,是在构建一套「面向大模型输出的反向编译器」
关键词: AI、Agent、Agent开发、大模型、编译器,Agent开发本质 一、认知转向 在大模型应用从“能回答”走向“能执行”的今天,Agent 开发正在经历一次认知转向。过去,我们关注的是如何让模型说得更像人;现在࿰…...
Phi-3-mini-4k-instruct-gguf效果惊艳:在HumanEval Python代码生成任务中通过率超72%
Phi-3-mini-4k-instruct-gguf效果惊艳:在HumanEval Python代码生成任务中通过率超72% 1. 模型简介 Phi-3-Mini-4K-Instruct是一个38亿参数的轻量级开源模型,采用GGUF格式提供。作为Phi-3系列的一员,这个模型经过精心训练,展现出…...
