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

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表

        链表是一种线性数据结构,由一系列按特定顺序排列的节点组成,这些节点通过指针相互连接。每个节点包含两部分:元素和指向下一个节点的指针。其中,最简单的形式是单向链表,每个节点含有一个信息域和一个指针域,该指针指向链表中的下一个节点,最后一个节点则指向一个空值。

1.1、Python中的链表

•        大部分都是用C语言实现链表,因为C有指针,可以很方便的控制内存,很轻易就可以实现链 表,在C/C++中,通常采用“指针+结构体”来实现链表。

•        Python是一门动态语言,可以直接把对象赋值给新的变量,我们采用“引用+类”来实现 链表。

•        结构:data为自定义的数据,next为下一个节点的地址。

•        链表的种类:单向链表、双向链表、单向循环链表、双向循环链表。 

1.2、基本元素

节点:每个节点有两个部分,左边称为值域,存放用户数据;右边部分称为指针域,用来存 放指向下一个元素的指针。

Head:head节点永远指向第一个节点。

Tail:tail节点永远指向最后一个节点。

None:链表中最后一个节点的指针域为None。

二、基本操作

2.1、节点的创建

class Node:def __init__(self, data):# 初始化节点,包含数据和指向下一个节点的指针self.data = dataself.next = None  

2.2、初始化单向链表

class LinkList:def __init__(self, node=None):# 初始化链表,头指针指向第一个节点(默认为None)self.__head = node

2.3、判断是否为空

    def is_empty(self):# 检查链表是否为空return self.__head == None

2.4、链表长度

    def length(self):# 计算链表的长度current = self.__headcount = 0while current != None:count += 1current = current.nextreturn count

2.5、遍历链表 

    def travel(self):# 遍历链表并打印每个节点的数据current = self.__headwhile current != None:print(current.data)current = current.next

2.4、插入节点

2.4.1、头节点

    def add(self, data):# 在链表头部添加新节点new_node = Node(data)new_node.next = self.__headself.__head = new_node

2.4.2、中间节点

    def insert(self, pos, data):# 在指定位置插入新节点if pos > self.length() - 1:self.append(data)  # 如果位置超出范围,添加到尾部elif pos <= 0:self.add(data)  # 如果位置小于等于0,添加到头部else:new_node = Node(data)pre = self.__headcount = 0while count < pos - 1:count += 1pre = pre.nextnew_node.next = pre.next  # 将新节点的next指向当前节点的nextpre.next = new_node  # 将前一个节点的next指向新节点

2.4.3、尾节点

    def append(self, data):# 在链表尾部添加新节点new_node = Node(data)if self.is_empty():self.__head = new_nodeelse:current = self.__headwhile current.next != None:current = current.nextcurrent.next = new_node

 

2.5、删除节点

    def remove(self, data):# 移除链表中指定数据的节点current = self.__headpre = Nonewhile current != None:if current.data == data:if current == self.__head:self.__head = current.next  # 如果是头节点,更新头指针else:pre.next = current.next  # 将前一个节点的next指向当前节点的nextbreakelse:pre = currentcurrent = current.next

2.6、查找节点

    def serch(self, data):# 查找链表中是否存在指定数据current = self.__headwhile current != None:if current.data == data:return True  # 找到数据,返回Trueelse:current = current.nextreturn False  # 遍历完成未找到数据,返回False

三、链表的特点

1、动态数据集合:链表允许动态的添加和删除元素,这使得它们在处理未知数量或频繁变 化的数据集时非常有用。

2、元素顺序:链表可以按照插入顺序来保持元素的顺序,这对于需要维护元素插入顺序的 应用程序非常有用。

3、 内存效率:与数组相比,链表在内存使用上更为高效,因为它们不需要连续的内存空间。 链表通过节点之间的指针来连接元素,这样可以更有效地利用内存空间。

4、避免数组扩容:数组在初始化时需要指定大小,如果超出大小,则需要扩容,这是一个 昂贵的操作。链表则可以避免这个问题,因为它们可以动态地增长。

四、单向链表的缺点

1、只能从头遍历到尾或者从尾遍历到头(一般从头到尾)。

2、链表相连的过程是单向的。实现的原理是上一个链表中有一个指向下一个的引用。

3、 我们可以轻松的到达下一个节点, 但是回到前一个节点是很难的。但是, 在实际开发中, 经 常会遇到需要回到上一个节点的情况。

举个例子:

        假设一个文本编辑用链表来存储文本。每一行用一个String对象存储在链表的 一个节点中。当编辑器用户向下移动光标时, 链表直接操作到下一个节点即可。但是当用 于将光标向上移动呢? 这个时候为了回到上一个节点, 我们可能需要从头开始, 依次走到 想要的节点上。

五、完整代码 

class Node:def __init__(self, data):# 初始化节点,包含数据和指向下一个节点的指针self.data = dataself.next = Noneclass LinkList:def __init__(self, node=None):# 初始化链表,头指针指向第一个节点(默认为None)self.__head = nodedef is_empty(self):# 检查链表是否为空return self.__head == Nonedef length(self):# 计算链表的长度current = self.__headcount = 0while current != None:count += 1current = current.nextreturn countdef travel(self):# 遍历链表并打印每个节点的数据current = self.__headwhile current != None:print(current.data)current = current.nextdef add(self, data):# 在链表头部添加新节点new_node = Node(data)new_node.next = self.__headself.__head = new_nodedef append(self, data):# 在链表尾部添加新节点new_node = Node(data)if self.is_empty():self.__head = new_nodeelse:current = self.__headwhile current.next != None:current = current.nextcurrent.next = new_nodedef insert(self, pos, data):# 在指定位置插入新节点if pos > self.length() - 1:self.append(data)  # 如果位置超出范围,添加到尾部elif pos <= 0:self.add(data)  # 如果位置小于等于0,添加到头部else:new_node = Node(data)pre = self.__headcount = 0while count < pos - 1:count += 1pre = pre.nextnew_node.next = pre.next  # 将新节点的next指向当前节点的nextpre.next = new_node  # 将前一个节点的next指向新节点def remove(self, data):# 移除链表中指定数据的节点current = self.__headpre = Nonewhile current != None:if current.data == data:if current == self.__head:self.__head = current.next  # 如果是头节点,更新头指针else:pre.next = current.next  # 将前一个节点的next指向当前节点的nextbreakelse:pre = currentcurrent = current.nextdef serch(self, data):# 查找链表中是否存在指定数据current = self.__headwhile current != None:if current.data == data:return True  # 找到数据,返回Trueelse:current = current.nextreturn False  # 遍历完成未找到数据,返回Falseif __name__ == '__main__':linklist = LinkList()linklist.add(10)  # 添加节点10linklist.add(20)  # 添加节点20linklist.append(100)  # 在尾部添加节点100linklist.add(30)  # 添加节点30linklist.add(40)  # 添加节点40print(linklist.is_empty())  # 检查链表是否为空print(linklist.length())  # 输出链表长度print('*****************')linklist.remove(30)  # 移除节点30# linklist.travel()  # 遍历链表并打印节点数据print(linklist.serch(40))  # 查找节点40是否存在# linklist.travel()  # 遍历链表并打印节点数据

六、思维导图 

相关文章:

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…...

NLP-RNN-LSTM浅析

双向 LSTM&#xff08;Bi - LSTM&#xff09; 结构原理&#xff1a;从图片中可以看到&#xff0c;双向 LSTM 由两个方向相反的 LSTM 组成&#xff0c;一个是正向 LSTM&#xff08;forward&#xff09;&#xff0c;一个是反向 LSTM&#xff08;backward&#xff09;。正向 LSTM …...

【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记

Cadence的Pcell designer官方入门教程 一、下载Pcell Designer 首先&#xff0c;前往Cadence网站下载Pcell Designer软件 &#xff08;具体安装过程就不记录了&#xff0c;大家自己去看视频吧&#xff09; 二、创建新的P-cell 然后打开Virtuoso&#xff0c;点击Tools->…...

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识&#xff0c;华夏&#xff0c;芊熠这三种车牌识别相机解密我都试过了&#xff0c;可以正常解密成功&#xff0c;其它品牌我暂时没有测试。超级简单&#xff0c;免费的&#xff0c;白嫖无敌&#xff01; 流程&#xff1a; ①&#xff1a;先导出配置文件&#xff0c;例如我以…...

一个前端,如何同时联调多个后端

文章目录 场景解决方案思路实现步骤创建项目目标前端配置安装cross-env配置vue.config.js配置package.json 测试 场景 一个前端&#xff0c;需要同时和N个后端联调 一个需求里有若干个模块&#xff0c;分别给不同的后端开发&#xff0c;前端需要和N个后端联调 本地开启一个端…...

向量的点乘的几何意义

源自AI 向量的点乘&#xff08;Dot Product&#xff09;在几何和图形学中有重要的意义。它不仅是数学运算&#xff0c;还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用&#xff1a; 1. 点乘的定义 对于两个向量 a 和 b&#xff0c;它们的点乘定义为&#xff1a;…...

如何组织和管理JavaScript文件:最佳实践与策略

在现代Web开发中&#xff0c;JavaScript已经成为不可或缺的一部分。随着项目规模的扩大&#xff0c;JavaScript代码的复杂性也随之增加。如何有效地组织和管理这些文件&#xff0c;不仅影响开发效率&#xff0c;还直接关系到项目的可维护性和可扩展性。本文将深入探讨如何组织和…...

mysql实时同步到es

测试了多个方案同步&#xff0c;最终选择oceanu产品&#xff0c;底层基于Flink cdc 1、实时性能够保证&#xff0c;binlog量很大时也不产生延迟 2、配置SQL即可完成&#xff0c;操作上简单 下面示例mysql的100张分表实时同步到es&#xff0c;优化备注等文本字段的like查询 创…...

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …...

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式&#xff1a; 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…...

R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...

全文链接&#xff1a;https://tecdat.cn/?p40365 在环境流行病学研究中&#xff0c;理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论&#xff0c;并引入了疾病映射以及对空间风险进行平滑处理…...

Java 反射 (Reflection) 详解

一、什么是 Java 反射&#xff1f; Java 反射 (Reflection) 是 Java 语言的一个强大特性&#xff0c;它允许 在运行时 检查和修改类、接口、字段和方法的信息&#xff0c;而不需要在编译时知道这些信息。 换句话说&#xff0c;反射可以让你在程序运行过程中“动态”地获取类的…...

在 C++ 中,`QMessageBox_s::question_s2` 和 `app.question_s2` 的区别(由DS-V3生成)

在 C 中&#xff0c;QMessageBox_s::question_s2 和 app.question_s2 的区别主要在于它们的调用方式和上下文范围。以下是对两者的详细解释&#xff1a; 1. QMessageBox_s::question_s2 解释&#xff1a; QMessageBox_s::question_s2 是一个静态成员函数的调用。它属于类 QMess…...

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点

vxe-grid 通过配置式给单元格字段格式化树结构数据&#xff0c;转换树结构节点 比如用户自定义配置好的数据源&#xff0c;通过在列中配置好数据&#xff0c;全 json 方式直接返回给前端渲染&#xff0c;不需要写任何格式化方法。 官网&#xff1a;https://vxetable.cn npm i…...

大厂算法面试常见问题总结:高频考点与备战指南

在大厂算法面试中&#xff0c;数据结构与算法是必考的核心内容。 无论是校招还是社招&#xff0c;算法题的表现往往决定了面试的成败。 为了帮助大家更好地备战&#xff0c;本文总结了大厂算法面试中的高频考点&#xff0c;并提供了详细的备战建议&#xff0c;助你轻松应对面…...

制造行业CRM选哪家?中大型企业CRM选型方案

在当今竞争激烈的制造行业中&#xff0c;企业对于客户关系管理&#xff08;CRM&#xff09;系统的需求日益增强&#xff0c;高效、智能的CRM系统已成为推动企业业务增长、优化客户体验的关键。在制造业 CRM 市场中&#xff0c;纷享销客和销售易都备受关注&#xff0c;且各自有着…...

PHP集成软件用哪个比较好?

在Windows环境下&#xff0c;使用PHP时&#xff0c;通常需要一个集成开发环境&#xff08;IDE&#xff09;或者集成软件来简化开发和调试过程。以下是几款常用且推荐的PHP集成软件&#xff0c;每款都有其特点&#xff0c;可以根据需求进行选择&#xff1a; 1. XAMPP 特点&…...

当pcie设备变化时centos是否会修改网络设备的名称(AI回答)

当pcie设备变化时centos是否会修改网络设备的名称 在CentOS&#xff08;以及其他基于Linux的操作系统&#xff09;中&#xff0c;网络接口的命名通常遵循特定的规则&#xff0c;尤其是在使用PCIe设备&#xff08;如网络适配器&#xff09;时。网络接口的命名通常基于设备的物理…...

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI&#xff0c;你可以执行以下命令&#xff1a; yarn global add vue/cli这个命令会全局安装 Vue CLI&#xff0c;让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...

【Python游戏】双人简单对战游戏

以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例&#xff0c;游戏中玩家可以控制两个角色进行对战&#xff0c;并且支持自定义图片(最好使用无底色的png图片)。完整源码以及实现思路&#xff1a; import pygame import os# 初始化 Pygame pygame.init()# 设置游戏窗…...

快速免费语音转文字终极指南:AsrTools让音频转字幕变得简单高效

快速免费语音转文字终极指南&#xff1a;AsrTools让音频转字幕变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into …...

别再只会用U盘了!手把手教你用SCP在Ubuntu局域网秒传文件(附ifconfig查IP详解)

告别U盘时代&#xff1a;Ubuntu局域网极速文件传输全攻略 每次看到同事还在用U盘来回拷贝代码&#xff0c;或是通过社交软件中转大文件时&#xff0c;我总忍不住想分享这个改变我工作效率的秘密武器。在Ubuntu系统组成的局域网环境中&#xff0c;SCP协议配合SSH加密通道&#…...

OpenContracts:构建结构化知识库,实现人类与AI智能体的协同工作

1. 项目概述&#xff1a;当AI需要“真知灼见”时&#xff0c;我们构建了什么在AI浪潮席卷的今天&#xff0c;我们似乎已经习惯了向一个“黑箱”提问&#xff0c;然后接受它基于海量但未经筛选的公共数据给出的答案。无论是分析一份复杂的合同&#xff0c;还是梳理公司内部的规章…...

5分钟快速掌握Python PDF文本提取:pdftotext终极免费指南

5分钟快速掌握Python PDF文本提取&#xff1a;pdftotext终极免费指南 【免费下载链接】pdftotext Simple PDF text extraction 项目地址: https://gitcode.com/gh_mirrors/pd/pdftotext 你是否曾为从PDF文件中提取文本而烦恼&#xff1f;面对复杂的PDF文档格式、密码保护…...

APK Installer:Windows平台上的安卓应用无缝安装解决方案

APK Installer&#xff1a;Windows平台上的安卓应用无缝安装解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Windows生态系统中直接运行安卓应用一直是开发者…...

阿里达摩院GTE中文向量模型:nlp_gte_sentence-embedding_chinese-large开发者实测报告

阿里达摩院GTE中文向量模型&#xff1a;nlp_gte_sentence-embedding_chinese-large开发者实测报告 1. 模型介绍&#xff1a;中文文本向量化的新选择 如果你正在寻找一个专门为中文优化的文本向量模型&#xff0c;阿里达摩院的GTE-Chinese-Large绝对值得关注。这个模型能够将中…...

PyMICAPS:气象数据可视化终极指南,从数据到专业图表仅需三步

PyMICAPS&#xff1a;气象数据可视化终极指南&#xff0c;从数据到专业图表仅需三步 【免费下载链接】PyMICAPS 气象数据可视化&#xff0c;用matplotlib和basemap绘制micaps数据 项目地址: https://gitcode.com/gh_mirrors/py/PyMICAPS PyMICAPS是一款基于Python的开源…...

从零到一:用kohya_ss打造你的专属AI画师,5步开启Stable Diffusion训练之旅

从零到一&#xff1a;用kohya_ss打造你的专属AI画师&#xff0c;5步开启Stable Diffusion训练之旅 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 你是否曾梦想拥有一个完全按照你的想法创作的AI画师&#xff1f;现在&#xff…...

中小企业流程目标制定:三步找准适合你的发展节奏-佛山鼎策创局破局增长咨询

好多中小企业的老板还有管理者&#xff0c;在动手制定流程之际&#xff0c;常常容易陷入两种极端的情形。其一&#xff0c;他们会径直套用大公司那般复杂繁琐的体系&#xff0c;从而致使员工们怨声连连&#xff0c;工作积极性遭受极大打击&#xff0c;整个企业运营效率变得很低…...

i.MX RT1064性能调优实战:手把手教你用Keil MDK和分散加载文件榨干TCM性能

i.MX RT1064性能调优实战&#xff1a;手把手教你用Keil MDK和分散加载文件榨干TCM性能 在嵌入式开发领域&#xff0c;性能优化始终是开发者面临的核心挑战之一。i.MX RT1064作为NXP推出的高性能跨界处理器&#xff0c;凭借其Cortex-M7内核和高达600MHz的主频&#xff0c;在音频…...