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----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
一、链表 链表是一种线性数据结构,由一系列按特定顺序排列的节点组成,这些节点通过指针相互连接。每个节点包含两部分:元素和指向下一个节点的指针。其中,最简单的形式是单向链表,每个节点含有一个信息域和一个指针域&…...
NLP-RNN-LSTM浅析
双向 LSTM(Bi - LSTM) 结构原理:从图片中可以看到,双向 LSTM 由两个方向相反的 LSTM 组成,一个是正向 LSTM(forward),一个是反向 LSTM(backward)。正向 LSTM …...
【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记
Cadence的Pcell designer官方入门教程 一、下载Pcell Designer 首先,前往Cadence网站下载Pcell Designer软件 (具体安装过程就不记录了,大家自己去看视频吧) 二、创建新的P-cell 然后打开Virtuoso,点击Tools->…...
臻识相机,华夏相机,芊熠车牌识别相机加密解密
臻识,华夏,芊熠这三种车牌识别相机解密我都试过了,可以正常解密成功,其它品牌我暂时没有测试。超级简单,免费的,白嫖无敌! 流程: ①:先导出配置文件,例如我以…...
一个前端,如何同时联调多个后端
文章目录 场景解决方案思路实现步骤创建项目目标前端配置安装cross-env配置vue.config.js配置package.json 测试 场景 一个前端,需要同时和N个后端联调 一个需求里有若干个模块,分别给不同的后端开发,前端需要和N个后端联调 本地开启一个端…...
向量的点乘的几何意义
源自AI 向量的点乘(Dot Product)在几何和图形学中有重要的意义。它不仅是数学运算,还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用: 1. 点乘的定义 对于两个向量 a 和 b,它们的点乘定义为:…...
如何组织和管理JavaScript文件:最佳实践与策略
在现代Web开发中,JavaScript已经成为不可或缺的一部分。随着项目规模的扩大,JavaScript代码的复杂性也随之增加。如何有效地组织和管理这些文件,不仅影响开发效率,还直接关系到项目的可维护性和可扩展性。本文将深入探讨如何组织和…...
mysql实时同步到es
测试了多个方案同步,最终选择oceanu产品,底层基于Flink cdc 1、实时性能够保证,binlog量很大时也不产生延迟 2、配置SQL即可完成,操作上简单 下面示例mysql的100张分表实时同步到es,优化备注等文本字段的like查询 创…...
DeepSeek动画视频全攻略:从架构到本地部署
DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …...
第3章 3.3日志 .NET Core日志 NLog使用教程
3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式: 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码: using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…...
R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...
全文链接:https://tecdat.cn/?p40365 在环境流行病学研究中,理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论,并引入了疾病映射以及对空间风险进行平滑处理…...
Java 反射 (Reflection) 详解
一、什么是 Java 反射? Java 反射 (Reflection) 是 Java 语言的一个强大特性,它允许 在运行时 检查和修改类、接口、字段和方法的信息,而不需要在编译时知道这些信息。 换句话说,反射可以让你在程序运行过程中“动态”地获取类的…...
在 C++ 中,`QMessageBox_s::question_s2` 和 `app.question_s2` 的区别(由DS-V3生成)
在 C 中,QMessageBox_s::question_s2 和 app.question_s2 的区别主要在于它们的调用方式和上下文范围。以下是对两者的详细解释: 1. QMessageBox_s::question_s2 解释: QMessageBox_s::question_s2 是一个静态成员函数的调用。它属于类 QMess…...
vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点
vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点 比如用户自定义配置好的数据源,通过在列中配置好数据,全 json 方式直接返回给前端渲染,不需要写任何格式化方法。 官网:https://vxetable.cn npm i…...
大厂算法面试常见问题总结:高频考点与备战指南
在大厂算法面试中,数据结构与算法是必考的核心内容。 无论是校招还是社招,算法题的表现往往决定了面试的成败。 为了帮助大家更好地备战,本文总结了大厂算法面试中的高频考点,并提供了详细的备战建议,助你轻松应对面…...
制造行业CRM选哪家?中大型企业CRM选型方案
在当今竞争激烈的制造行业中,企业对于客户关系管理(CRM)系统的需求日益增强,高效、智能的CRM系统已成为推动企业业务增长、优化客户体验的关键。在制造业 CRM 市场中,纷享销客和销售易都备受关注,且各自有着…...
PHP集成软件用哪个比较好?
在Windows环境下,使用PHP时,通常需要一个集成开发环境(IDE)或者集成软件来简化开发和调试过程。以下是几款常用且推荐的PHP集成软件,每款都有其特点,可以根据需求进行选择: 1. XAMPP 特点&…...
当pcie设备变化时centos是否会修改网络设备的名称(AI回答)
当pcie设备变化时centos是否会修改网络设备的名称 在CentOS(以及其他基于Linux的操作系统)中,网络接口的命名通常遵循特定的规则,尤其是在使用PCIe设备(如网络适配器)时。网络接口的命名通常基于设备的物理…...
Mac arm架构使用 Yarn 全局安装 Vue CLI
dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI,你可以执行以下命令: yarn global add vue/cli这个命令会全局安装 Vue CLI,让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...
【Python游戏】双人简单对战游戏
以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例,游戏中玩家可以控制两个角色进行对战,并且支持自定义图片(最好使用无底色的png图片)。完整源码以及实现思路: import pygame import os# 初始化 Pygame pygame.init()# 设置游戏窗…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
