单链表在Python中的实现技巧

news2025/4/9 15:55:01

cd9fe0fec7348c48bc0a49045bde4c5a.png

更多Python学习内容:ipengtao.com

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。链表的优点是插入和删除操作非常高效,特别是在需要频繁修改数据结构的情况下。本文将详细介绍如何在Python中创建单链表,并包含相应的示例代码,帮助全面掌握这一基础而重要的技能。

什么是单链表

单链表是一种链式数据结构,其中每个节点包含一个数据域和一个指向下一个节点的指针。链表的第一个节点称为头节点,最后一个节点指向None,表示链表的结束。

单链表的结构

每个节点的结构通常如下:

+---------+------+
|  Data   | Next |
+---------+------+
  • Data:存储节点的数据。

  • Next:指向下一个节点的指针。

创建单链表

定义节点类

首先,需要定义一个节点类,用于表示单链表中的节点。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

在这个示例中,Node 类包含两个属性:data 用于存储节点的数据,next 用于存储指向下一个节点的指针。

定义链表类

接下来,定义一个链表类,用于管理节点的操作,如插入、删除和遍历等。

class LinkedList:
    def __init__(self):
        self.head = None

在这个示例中,LinkedList 类包含一个属性:head,用于存储链表的头节点。

基本操作

插入操作

插入操作用于将新节点添加到链表中。可以在链表的头部、尾部或指定位置插入新节点。

在头部插入
class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_head(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

在这个示例中,insert_at_head 方法创建一个新节点,并将其插入到链表的头部。

在尾部插入
class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return
        last = self.head
        while last.next:
            last = last.next
        last.next = new_node

在这个示例中,insert_at_tail 方法创建一个新节点,并将其插入到链表的尾部。

删除操作

删除操作用于从链表中移除指定节点。可以删除头节点、尾节点或任意位置的节点。

删除头节点
class LinkedList:
    def __init__(self):
        self.head = None

    def delete_head(self):
        if self.head is None:
            return
        self.head = self.head.next

在这个示例中,delete_head 方法删除链表的头节点。

删除指定节点
class LinkedList:
    def __init__(self):
        self.head = None

    def delete_node(self, key):
        temp = self.head
        if temp is not None:
            if temp.data == key:
                self.head = temp.next
                temp = None
                return
        while temp is not None:
            if temp.data == key:
                break
            prev = temp
            temp = temp.next
        if temp == None:
            return
        prev.next = temp.next
        temp = None

在这个示例中,delete_node 方法删除包含指定数据的节点。

遍历操作

遍历操作用于访问链表中的每个节点,并进行相应的操作。

打印链表
class LinkedList:
    def __init__(self):
        self.head = None

    def print_list(self):
        temp = self.head
        while temp:
            print(temp.data, end=" ")
            temp = temp.next
        print()

在这个示例中,print_list 方法遍历链表并打印每个节点的数据。

查找操作

查找操作用于在链表中查找包含指定数据的节点。

查找指定节点
class LinkedList:
    def __init__(self):
        self.head = None

    def search(self, key):
        temp = self.head
        while temp:
            if temp.data == key:
                return True
            temp = temp.next
        return False

在这个示例中,search 方法在链表中查找包含指定数据的节点,如果找到则返回 True,否则返回 False

完整的单链表类

下面是一个完整的单链表类,包括插入、删除、遍历和查找操作的实现。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_head(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return
        last = self.head
        while last.next:
            last = last.next
        last.next = new_node

    def delete_head(self):
        if self.head is None:
            return
        self.head = self.head.next

    def delete_node(self, key):
        temp = self.head
        if temp is not None:
            if temp.data == key:
                self.head = temp.next
                temp = None
                return
        while temp is not None:
            if temp.data == key:
                break
            prev = temp
            temp = temp.next
        if temp == None:
            return
        prev.next = temp.next
        temp = None

    def print_list(self):
        temp = self.head
        while temp:
            print(temp.data, end=" ")
            temp = temp.next
        print()

    def search(self, key):
        temp = self.head
        while temp:
            if temp.data == key:
                return True
            temp = temp.next
        return False

# 使用示例
if __name__ == "__main__":
    ll = LinkedList()
    ll.insert_at_head(3)
    ll.insert_at_head(2)
    ll.insert_at_head(1)
    ll.insert_at_tail(4)
    ll.insert_at_tail(5)

    print("链表内容:")
    ll.print_list()  # 输出:1 2 3 4 5

    ll.delete_head()
    print("删除头节点后:")
    ll.print_list()  # 输出:2 3 4 5

    ll.delete_node(3)
    print("删除节点3后:")
    ll.print_list()  # 输出:2 4 5

    print("查找节点4:", ll.search(4))  # 输出:True
    print("查找节点6:", ll.search(6))  # 输出:False

总结

本文详细介绍了如何在Python中创建单链表,包括定义节点类和链表类,并实现插入、删除、遍历和查找操作。通过具体的示例代码,展示了如何使用这些操作来管理和操作链表数据结构。单链表是一种基础而重要的数据结构,掌握它可以帮助你在日常开发中更高效地处理各种数据管理任务。本文不仅涵盖了基本的链表操作,还提供了实际应用场景的示例,旨在帮助大家全面理解和应用单链表。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

cd0ae7846f7a29d31bfa21e18376c2db.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

6986aa2418fdb40b59635c69c44b9b96.jpeg

往期推荐

历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)

Python基础学习常见的100个问题.pdf(附答案)

学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

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

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

相关文章

【深度学习】-WASB-调试说明

要改这么几个地方: 代码仓库:/Desktop/code/python_project/WASB-SBDT-main/ 篮球数据集xx_xx_11.xml只保留最后一个11.xml 并把11下直接放置11 video: 这里的东西被我改了,要以仓库为准

openssh版本升级实战(修补ssh漏洞)基于RedHat8.4版本测试--已成功升级

升级前具有漏洞的的版本 通过命令查看目前系统的ssh和sshd版本: ssh -V sshd -V 注意:由于ssh是远程连接服务器的功能,在进行下面操作升级openssh前,请打开多个连接会话保持,如升级失败,可通过已连接的会话…

Transform Data with SQL

rm -r dp-203 -f git clone https://github.com/MicrosoftLearning/dp-203-azure-data-engineer dp-203 cd dp-203/Allfiles/labs/01 ./setup.ps1 -- This is auto-generated code SELECTTOP 100 * FROMOPENROWSET(BULK https://datalakexxxxxxx.dfs.core.windows.net/fil…

hive表小练习

-- 将对应的命令写在每个步骤中 -- 1.在hive中创建数据库school create database if not exists school; -- 2.在数据库school中创建如下的表 每张表的列分隔符都是, 存储格式是textfile 创建表名为student_info, 字段为stu_id 类型为string,注释为学生id 字段为stu_name 类…

【Python学习】流程控制、函数与类详解

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言,提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

解决Linux环境Qt报“cannot find -lgl“问题

今天,在Ubuntu 18.04.6环境下,安装Qt5.14.2之后,运行一个QWidget工程,发现Qt报"cannot find -lgl"错误。     出现这种现象的原因:Qt的Path路径没有配置,缺少libqt4-dev依赖包和一些必要的组件…

算法题-回文子串和最长回文子序列

算法题-回文子串和最长回文子序列 一、647. 回文子串二、516. 最长回文子序列 一、647. 回文子串 中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个…

基于SpringBoot的招聘信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等,欢迎咨询我!!)

文章目录 目录 文章目录 详细视频展示: 系统具体实现效果(看看我的实力) 技术栈(详细的描述提供给同学思路参考) 2.1 Java语言介绍 2.2 B/S架构 2.3 MySQL 数据库介绍 2.4 MySQL环境配置 2.5 SpringBoot框…

14-24 剑和侠客 – 预训练模型三部曲1 - 文本

在这个三部曲中,我们旨在从三个部分深入研究预训练模型:文本、图像和机器人。 我们旨在探索它们的概念、出现以及这些模型的工作原理。还将研究预训练模型的不同架构和类型。 探索哪些是最强大的,以及预训练模型和 Transformers 是否是 LLM…

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议(IAR 2024) 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议(IAR 2024)将于2024年10月18-20日在新加坡隆重召开。会议将围绕…

提升系统稳定性:熔断、降级和限流策略详解

文章目录 前言一、熔断(Circuit Breaker)二、降级(Degradation)三、限流(Rate Limiting)四、应用案例五、小结推荐阅读 前言 随着互联网业务的快速发展,系统稳定性和高可用性成为现代分布式系统…

Linux wget报未找到命令

wget报未找到命令需要安装wget 1、下载wget安装文件,本次于华为云资源镜像下载 地址:https://mirrors.huaweicloud.com/centos-vault/7.8.2003/os/x86_64/Packages/ 2、下载后上传到安装服务器/install_package,执行命令安装 rpm -ivh /i…

idea创建的maven项目pom文件引入的坐标报红原因

如下所示 我们在引入某些依赖坐标的时候,即使点击了右上角的mavne刷新之后还是报红。 其实这是正常现象,实际上是我们的本地仓库当中没有这些依赖坐标,而idea就会通过报红来标记这些依赖来说明在我们的本地仓库是不存在的。 那有的同学就会…

JavaScript主要用途和方向

JavaScript是一种广泛使用的编程语言,可以用于开发各种类型的应用程序,包括Web应用程序、桌面应用程序、移动应用程序和游戏等。以下是博主整理的JavaScript可以做的一些事情: 1. Web开发: JavaScript是Web开发的核心语言之一&…

接口自动化测试思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键字驱动测试看上去与手工测…

构建滑块组件_第 2 部分

本篇我们继续学习滑块组件,让我们把滑块组件构建的更好; ● 首先,我们想要获取组件的三个点,首先在获取到他的HTML元素 const dotContainer document.querySelector(.dots);● 接着遍历 slides 数组,并在动态创建 元…

系统测试-缺陷管理学习

目录 1、什么是缺陷 2、缺陷的类型 3、缺陷的交付物 4、缺陷报告的基本格式 1、什么是缺陷 就是软件最终的功能实现跟需求不一致的现象就是缺陷 2、缺陷的类型 做少了,做错了,做多了,做差了 3、缺陷的交付物 缺陷报告:也叫…

贝尔曼方程(Bellman Equation)

贝尔曼方程(Bellman Equation) 贝尔曼方程(Bellman Equation)是动态规划和强化学习中的核心概念,用于描述最优决策问题中的价值函数的递归关系。它为状态值函数和动作值函数提供了一个重要的递推公式,帮助我们计算每个状态或状态-动作对的预期回报。 贝尔曼方程的原理 …

冯诺依曼体系结构与操作系统(Linux)

文章目录 前言冯诺依曼体系结构(硬件)操作系统(软件)总结 前言 冯诺依曼体系结构(硬件) 上图就是冯诺依曼体系结构图,主要包括输入设备,输出设备,存储器,运算…

基于机器学习(支持向量机,孤立森林,鲁棒协方差与层次聚类)的机械振动信号异常检测算法(MATLAB 2021B)

机械设备异常检测方法流程一般如下所示。 首先利用传感器采集机械运行过程中的状态信息,包括,振动、声音、压力、温度等。然后采用合适的信号处理技术对采集到机械信号进行分析处理,提取能够准确反映机械运行状态的特征。最后采用合理的异常决…