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 = data
        self.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.__head
        count = 0
        while current != None:
            count += 1
            current = current.next
        return count

2.5、遍历链表 

    def travel(self):
        # 遍历链表并打印每个节点的数据
        current = self.__head
        while 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.__head
        self.__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.__head
            count = 0
            while count < pos - 1:
                count += 1
                pre = pre.next
            new_node.next = pre.next  # 将新节点的next指向当前节点的next
            pre.next = new_node  # 将前一个节点的next指向新节点

2.4.3、尾节点

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

 

2.5、删除节点

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

2.6、查找节点

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

三、链表的特点

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

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

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

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

四、单向链表的缺点

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

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

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

举个例子:

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

五、完整代码 

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

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

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

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

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

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

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

    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.__head
            count = 0
            while count < pos - 1:
                count += 1
                pre = pre.next
            new_node.next = pre.next  # 将新节点的next指向当前节点的next
            pre.next = new_node  # 将前一个节点的next指向新节点

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

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

if __name__ == '__main__':
    linklist = LinkList()
    linklist.add(10)  # 添加节点10
    linklist.add(20)  # 添加节点20
    linklist.append(100)  # 在尾部添加节点100
    linklist.add(30)  # 添加节点30
    linklist.add(40)  # 添加节点40

    print(linklist.is_empty())  # 检查链表是否为空
    print(linklist.length())  # 输出链表长度
    print('*****************')
    linklist.remove(30)  # 移除节点30
    # linklist.travel()  # 遍历链表并打印节点数据
    print(linklist.serch(40))  # 查找节点40是否存在
    # linklist.travel()  # 遍历链表并打印节点数据

六、思维导图 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…

Docker:3、在VSCode上安装并运行python程序或JavaScript程序

1.VSCode上安装并运行python程序&#xff1a; 1.1.安装Docker插件 1.2.新建自动化脚本DockerFile FROM python:3.-slim-buster WORKDIR /app COPY .. RUN pip3 install -r requirements.txt CMD ["python3", "app.py"]COPY <本地路径><目标…

MOS管炸了,PWM“死区”时间得了解一下

从字面上来看“死区”的意思就是&#xff1a;如果处于这个区&#xff0c;那就会出现“损坏”的现象&#xff0c;直白点&#xff0c;就是“禁区”&#xff01; 实际应用中&#xff0c;比如大功率设备的电机&#xff0c;还有变频器等驱动电路&#xff0c;多部分都是采用MOS管和IG…

idea-代码补全快捷键

文章目录 前言idea-代码补全快捷键1. 基本补全2. 类型匹配补全3. 后缀补全4. 代码补全 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;…

保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型

1. 安装Ollama 根据自己的系统下载Ollama&#xff0c;我的是Linux&#xff0c;所以我使用如下命令进行下载安装&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2. 安装Open-WebUI 使用 Docker 的方式部署 open-webui &#xff0c;使用gpu的话按照如下命令进行 …

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘&#xff0c;以及后续的模型数据下载也在C盘&#xff0c;导致会占用C盘空间&#xff0c;所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…

以教代学——费曼学习法

本文是思维导图&#xff0c;算是费曼学习法精髓我的个人总结&#xff0c;如果条件允许的话可以去看看费曼自传性质的书&#xff0c;书名见文末。 《别闹了&#xff0c;费曼先生》&#xff1a;英文书名为《Surely Youre Joking, Mr. Feynman!》&#xff0c;这是一本自传性质的书…

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言&#xff1a; 在现代Web应用和微服务架构中&#xff0c;用户身份验证和信息安全传输是核心问题。JSON Web Token&#xff08;J…

工控网络安全介绍 工控网络安全知识题目

31.PDR模型与访问控制的主要区别(A) A、PDR把对象看作一个整体 B、PDR作为系统保护的第一道防线 C、PDR采用定性评估与定量评估相结合 D、PDR的关键因素是人 32.信息安全中PDR模型的关键因素是(A) A、人 B、技术 C、模型 D、客体 33.计算机网络最早出现在哪个年代(B) A、20世…

快速定位并优化CPU 与 JVM 内存性能瓶颈

1. CPU 性能优化实战 CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。当 CPU 过于繁忙&#xff0c;就像“人脑”并发处理过多的事情&#xff0c;会降低做…

Kimi K1.5 与 DeepSeek R1:AI 模型的深度对比

文章目录 一、背景介绍二、核心功能对比三、K1.5 使用方法&#xff1a;四、总结 随着人工智能技术的飞速发展&#xff0c;大型语言模型在各个领域都展现出了巨大的潜力。Kimi K1.5 和 DeepSeek R1 作为当前备受关注的两款先进 AI 模型&#xff0c;各自拥有独特的功能和优势。本…

机器学习-生命周期

假如一个用户向银行申请贷款&#xff0c;银行该如何对这个用户进行评估?很明显&#xff0c;银行首先需要调查清楚该用户的资金储备情况和信用历史等&#xff0c;然后再决定是否向其放款。 整个机器学习生命周期如下图所示&#xff1a; 1、定义问题 在使用机器学习中的术语表…

Leetcode:学习记录(二)

按照https://leetcode.cn/circle/discuss/RvFUtj/顺序刷题 零、经验记录 1. 学会画图分析 2. 学会找终止条件 3. 做一道就高质量完成 一、二分算法 0. 总结&#xff1a;大于某个数的第一个数的位置有固定模板&#xff0c;其中要讨论最后一个数小于等于目标数的情况 1. 二…

Elasticsearch AI Assistant 集成 DeepSeek,1分钟搭建智能运维助手

作者&#xff1a;来自阿里云 - 魏子珺 简介&#xff1a; Elasticsearch 新支持 DeepSeek 系列模型&#xff0c;使用 AI 助手&#xff0c;通过自然语言交互&#xff0c;为可观测性分析、安全运维管理及数据智能处理提供一站式解决方案。 一、Elasticsearch AI Assistant 介绍 E…

DeepSeek操作Excel,实现图表自动化生成

案例 让DeepSeek操作Excel&#xff0c;实现图表自动化生成。我们只要用自然语言输入我们的需求&#xff08;根据哪块单元格区域做什么图表&#xff09;&#xff0c;就可以直接在Excel中自动生成图表。 操作主界面和图表效果 设置接入方式 这里提供了多种接入方式将DeepSeek接…

在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证

文章目录 一、引言二、什么是 JSON Web 令牌&#xff1f;三、什么是 JSON Web 令牌结构&#xff1f;四、设置 JWT 令牌身份验证4.1 创建新的 .NET 8 Web API 项目4.2 安装所需的 NuGet 软件包4.3 创建 JWT 配置模型4.4 将 JWT 配置添加到您的 appsettings.json 中4.5 为 Config…

【R语言】主成分分析与因子分析

一、主成分分析 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一种常用的无监督数据降维技术&#xff0c;广泛应用于统计学、数据科学和机器学习等领域。它通过正交化线性变换将&#xff08;高维&#xff09;原始数据投影到一个新的坐标系&#xff…

linux下pip下载项目失败

想下载CLIP的项目复现代码的时候&#xff0c;出现问题如下&#xff1a; 于是手动使用 Git 克隆仓库&#xff0c; git clone https://github.com/openai/CLIP.git cd CLIP pip install .ls查看文件如下&#xff1a;(手动克隆git项目成功)

Windows桌面系统管理8:项目实施

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…

【JavaScript】实战案例-放大镜效果、图片切换

目录 实现这种图片切换的和放大镜的效果&#xff1a; 第一步&#xff1a;图片的切换 第二步&#xff1a;鼠标经过中等盒子&#xff0c;显示隐藏大盒子 第三步&#xff1a;黑色遮罩盒子跟着鼠标来移动 遮罩层盒子移动的坐标&#xff1a; 总结一下~本章节对我有很大的收获…