数据结构算法之链表指针LinkList

链表是一种数据结构,它包含一系列存储在内存中随机位置的节点,从而实现高效的内存管理。链表中的每个节点包含两个主要组成部分:数据部分和对序列中下一个节点的引用。

链表种类:

单项链表

单链表是最简单的链表类型,其中每个节点包含一些数据和对序列中下一个节点的引用。它们只能以单一方向遍历 - 从头(第一个节点)到尾部(最后一个节点)。

单链表中的每个节点通常由两部分组成:

  • 数据:节点中存储的实际信息。

  • 下一个指针:对下一个节点的引用。最后一个节点的下一个指针通常设置为空。

由于这些数据结构只能单向遍历,因此通过值或索引访问特定元素需要从头部开始,依次遍历节点,直到找到所需的节点。此操作的时间复杂度为 O(n),对于大型列表来说效率较低。

在单链表的开头插入和删除节点效率很高,时间复杂度为 O(1)。然而,在中间或末尾插入和删除需要遍历列表直到该点,导致时间复杂度为 O(n)。

单链表的设计使它们成为执行列表开头发生的操作时有用的数据结构。

定义节点类

class Node:'''data: 节点保存的数据_next: 保存下一个节点对象'''def __init__(self, data, pnext=None):self.data = dataself._next = pnext

 

链表中的基本要素

① 结点(也可以叫节点或元素),每一个结点有两个域;

  • 左边部份叫值域,用于存放用户数据
  • 右边叫指针域,一般是存储着到下一个元素的指针

② head结点:head是一个特殊的结节,head结点永远指向第一个结点

③ tail结点:tail结点也是一个特殊的结点,tail结点永远指向最后一个节点

④ None:链表中最后一个结点指针域的指针指向None值,因也叫接地点,所以有些资料上用电气上的接地符号代表None

代码展示

# 定义三个节点
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)# 将这三个节点彼此相连
node1.next = node2
node2.next = node3

 

单向循环链表

循环链表是链表的一种特殊形式,其中最后一个节点指向第一个节点,从而创建循环结构。这意味着,与我们迄今为止看到的单链表和双向链表不同,循环链表不会结束;相反,它会循环。

循环链表的循环性质使其非常适合需要连续循环的场景,例如从最后一个玩家循环回到第一个玩家的棋盘游戏,或者循环调度等计算算法。

 

双向链表 

单链表的一个缺点是我们只能在一个方向上遍历它们,并且在需要时无法迭代回前一个节点。这种限制限制了我们执行需要双向导航的操作的能力。

双链表通过在每个节点中合并一个额外的指针来解决这个问题,确保可以在两个方向上遍历该列表。双向链表中的每个节点包含三个元素:数据、指向下一个节点的指针和指向前一个节点的指针。

 

双向循环链表 

特点:

双向链表每个节点有两个指针,可以向前或向后遍历。
可以从任意节点开始向前或向后遍历整个链表。
插入和删除节点的操作相对容易,只需要调整节点的前驱和后继指针即可。
对于双向链表,可以更轻松地实现双向循环链表,即首尾节点相连。
常见操作:

遍历链表:可以从头节点开始,按照后继指针依次访问每个节点。或者从尾节点开始,按照前驱指针依次访问每个节点。
插入节点:在给定位置之前或之后插入一个新节点,只需要调整前后节点的指针即可。
删除节点:删除给定位置上的节点,同样通过调整前后节点的指针来实现。
查找节点:可以通过遍历链表来查找特定值或者特定位置上的节点。

 

为什么要使用链表?

使用链表是为了克服与在常规列表和数组中存储数据相关的各种缺点,在列表中,在除末尾以外的任何位置插入或删除元素都需要将所有后续项移动到不同的位置。此过程的时间复杂度为 O(n),并且会显着降低性能,尤其是随着列表大小的增长。

然而,链接列表的操作方式不同。它们将元素存储在各种不连续的内存位置,并通过指向后续节点的指针将它们连接起来。这种结构允许链表在任何位置添加或删除元素,只需修改链接以包含新元素或绕过已删除的元素即可。

一旦确定了元素的位置并且可以直接访问插入或删除点,则可以在 O(1) 时间内实现添加或删除节点。

动态尺寸

Python 列表是动态数组,这意味着它们提供了修改大小的灵活性。但这个过程涉及一系列复杂的操作,包括将数组重新分配到新的、更大的内存块。这种重新分配效率低下,因为元素被复制到新块,可能会分配比立即需要的空间更多的空间。

相反,链表可以动态增长和收缩,而不需要重新分配或调整大小。这使它们成为需要高度灵活性的任务的更好选择。

内存效率

列表为其连续块中的所有元素分配内存。如果列表需要增长超过其初始大小,则必须分配一个新的、更大的连续内存块,然后将所有现有元素复制到这个新块。这个过程既耗时又低效,尤其是对于大型列表。另一方面,如果列表的初始大小被高估,则未使用的内存就会被浪费。

相反,链表为每个元素单独分配内存。这种结构可以提高内存利用率,因为可以在添加新元素时为其分配内存。

什么时候应该使用链接列表?

虽然链表比常规列表和数组具有某些优势,例如动态大小和内存效率,但它们也有其局限性。由于必须存储每个元素的指针以引用下一个节点,因此使用链表时每个元素的内存使用量会更高。此外,该数据结构不允许直接访问数据。访问一个元素需要从列表的开头开始顺序遍历,导致搜索时间复杂度为 O(n)。

使用链表还是数组的选择取决于应用程序的具体需求。链接列表在以下情况下最有用:

  • 需要频繁插入和删除很多元素

  • 数据大小不可预测或可能频繁变化

  • 不需要直接访问元素

  • 数据集包含大型元素或结构

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

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

相关文章

webm转换mp4,四种转换方法任你选!

在数字媒体日益盛行的今天,视频格式的转换已成为许多用户不可或缺的技能。其中,WebM和MP4作为两种广受欢迎的视频格式,各有其特点和优势。 WebM以其高效压缩和流畅播放而著称,而MP4则因其广泛的兼容性和易用性受到欢迎。因此&…

借助调试工具理解BLE协议_1.蓝牙简介和BLE工作流程

1.蓝牙简介 蓝牙是一种近距离无线通信技术,运行在2.4GHz免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。蓝牙4.0以后的版本分为两种模式,单模蓝牙和双模蓝牙。 单模蓝牙&#xf…

杰理语音芯片AC1042A,变声喇叭玩具方案—云信通讯

变声喇叭玩具内置多种声音效果,例如机器人声、怪兽声、动物声以及各种搞笑声,让孩子能够在玩耍过程中体验不同的声音变化。有一些变声喇叭还可以模拟名人声音,让孩子们仿佛变身成为自己心目中的英雄或者明星。无论是自由的想象力游戏还是模仿…

借助调试工具理解BLE协议_2.BLE协议栈

名词解释: BT SIG英文全称为Bluetooth Special Interest Group(蓝牙特别兴趣组),网址为 www.Bluetooth.com。 Bluetooth Technology Website SIG成立于1998年,是一个全球技术交流组织,拥有超过36000家公…

进阶 RocketMQ - 消息存储-一张图掌握核心要点

看了很多遍源码整理的 一张图进阶 RocketMQ 图片,关于 RocketMQ 你只需要记住这张图! 消息传递责任已移交至Broker,接下来如何处理?首先,我们需要确保消息的持久化,避免因宕机导致的数据丢失。那么&#xf…

什么是OCR转写服务?

OCR(Optical Character Recognition,光学字符识别)转写服务是一种技术,用于将图像或扫描文档中的文字转换为可编辑的文本格式。这项服务通过识别图像中的文字,并将其转换成计算机可读的文本形式,从而使得用…

期权懂基础知识分享:场外期权怎么做?

今天带你了解期权懂基础知识分享:场外期权怎么做?场外个股期权是一种金融工具,用于在股票市场之外交易。 场外期权怎么做? 签订框架协议:个人需要与机构签订场外期权框架协议,通常无需单独开立账户。 询价…

ARP欺骗的原理与详细步骤

ARP是什么: 我还记得在计算机网络课程当中,学过ARP协议,ARP是地址转换协议,是链路层的协议,是硬件与上层之间的接口,同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信&#xff0c…

怎么把图片压缩小一点?让你的图片秒变小清新!

怎么把图片压缩小一点?在数字化时代,图片已经成为我们生活中不可或缺的一部分。无论是社交媒体的分享,还是工作文档的编辑,图片都扮演着重要的角色。然而,随着图片数量的增加,存储空间的问题也日益凸显。幸…

STM32项目开发遇见问题解决2024.6.4V2

1、结构体指针的赋值不能放在main函数之前 参数1、参数2可以修改后,接着添加功能,设置一个保存按键,当修改完参数1、参数2后,按下保存,可以将两者和当前的测量值一起保存在flash中,并将这三个变量放在一个结…

软件系统测试的定义和测试内容介绍

一、什么是软件系统测试? 软件系统测试是指对软件系统的功能、性能、可靠性、稳定性等方面进行全面检查和验证的过程。其目的是发现潜在的问题、缺陷和风险,并确保软件系统的质量和稳定性。 软件系统测试可以分为多个阶段,包括单元测试、集成测试、系…

中介模式实现聊天室

中介者模式的核心逻辑就是解耦对象‘多对多’的相互依赖关系。当遇到一大堆混乱的对象呈现“网状结构”,利用通过中介者模式解耦对象之间的通讯。 代码案例 抽象中介类 public abstract class AbstractChatRoom {public abstract void notice(String message , Us…

计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)

前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算…

Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发家政服务

Java18​App端采用uniapp开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发 家政服务 家政服务是一个专为家政服务人员设计的平台,该平台旨在提供便捷、高效的工作机会,同时确保服务质量和客户体验。 以下是关于家政服务师…

python入门1

文章目录 前言一、python概述1、下载和安装2、python基础2.1 变量2.2 数据类型2.3Python中的注释2.4 运算符2.5 数值类型标准类型函数2.6 I/O操作 二、字符串1、字符串操作2、字符串内建函数3、格式化字符串3.1 在字符串中使用变量3.2 format()方法的基本使用 三、列表与元组1、…

鸿蒙工程目录介绍

鸿蒙构建完毕生成hhvp文件。 项目结构: .hvigor : 是存储构建配置文件的 .idea : 是开发工具拥有的目录 AppScope : 是全局的公共资源存放位置 hvigor :存放前端构建配置信息 oh_modules : 存放项目用到的第三方包 build-profile.json5 : 应用级别的构…

Mysql基础教程(15):别名

MySQL 别名 在本文中,我们讨论了 MySQL 中的列别名,表别名和派生表别名,以及使用别名来简化 SQL 和提高 SQL 的可读性。 如果在一个 SQL 中涉及到多个表,我们需要使用 table_name.column_name 这样的方式来引用每个表的字段&…

麒麟系统 安装xrdp 远程桌面方法记录

一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后,需要安装一个远程桌面工具,可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…

做项目管理,有哪些证书值得考?

考证可以提升技能水平,增强职场竞争力。 01PMP认证 PMP是受全球认可的项目管理专业人士资格认证,在国际上具有权威性,被媒体公认为继MBA、MPA之后的三大就业金字招牌。 在国内认可度也很高,中石油、中国石化、中兴通讯等大型企…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)二

在网上看到别人在YOLO V9 源码上实现了旋转目标检测,但是我在按照他的方法进行训练的时候出现了错误提示,问题弄了很久都没有解决,欢迎各位大佬交流讨论给出建议 代码【免费】目标检测模型YOLOV9OBB资源-CSDN文库 运行训练脚本train.py提示如…