python之双链表

news2024/11/25 4:25:46

双链表简单讲解

双向链表(doubly linked list)是一种链式数据结构,它的每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表相比,双向链表可以在任何位置进行插入和删除操作,因为每个节点都可以通过前向或后向指针访问其前驱和后继。

图例说明

这里讲解一个双链表节点添加的例子,我们看到10,15,20这三个点的位置,其中原本是10和20相互连接,首先,我们要先将15的next指向20,因为,如果我们现将10的next指向15的话,那20的地址就会消失,这要就会导致我们的数据丢失,所以要先连接15和20,然后就是把20的prior(前驱)指向15,最后再是15的prior(前驱)指向10,10的next指向15,这样我们就完成插入的程序了。

代码实现

class Node(object):
    """
    创建一个双链表
    """

    def __init__(self, item):
        self.item = item
        self.next = None
        self.prior = None


class FunctionLink(object):
    def __init__(self):
        self.linklength = 1
        self.head = None  # 首先初始化,让头结点指向空

    def creatLinkListHead(self, li):
        """
        头插法
        :return:
        """
        head = Node(li[0])
        for element in li[1:]:
            self.linklength += 1
            node = Node(element)  # 创建一个节点
            node.next = head
            head.prior = node
            head = node
        return head

    def creatLinkListTail(self, li):
        """
        此方法为尾插法
        :param li:
        :return:
        """
        head = Node(li[0])
        for element in li[1:]:
            self.linklength += 1
            node = Node(element)
            head.next = node
            node.prior = head
        return head

    def printLinkList(self, lk):
        """
        此方法为打印链表中的数字
        :param lk:传入头结点的地址
        :return:
        """
        while lk:
            if not lk.next:
                print(lk.item)
                lk = lk.next
            else:
                print(lk.item, end=",")
                lk = lk.next

    def inserLinkList(self, index, element, curNode):
        """
        此方法为插入数据
        :param index:输入要传入数据的位置索引值
        :param element: 输入要传入的数据
        :param curNode: 输入你的头链表位置
        :return:
        """
        head = curNode  # 现将链表的头链表进行存储
        number = 1
        if index > self.linklength:
            raise Exception("对不起您输入的索引值超过了链表的长度")
        else:
            while True:
                if index == number:
                    p = Node(element)  # 创建节点
                    p.next = curNode.next
                    curNode.next.prior = p
                    p.prior = curNode
                    curNode.next = p
                    self.linklength += 1
                    curNode = head
                    break
                else:
                    curNode = curNode.next
                    number += 1

    def deleteLinkList(self, index, curNode):
        """
        删除输入的索引值后面的结点
        :param index: 要删除的索引位置
        :param curNode: 头结点地址
        :return:
        """
        head = curNode  # 先将头指针的地址赋值给一个临时节点
        number = 1
        if index > self.linklength:
            raise Exception("对不起,您输入的索引位置超过了链表的长度,请重新输入")
        else:
            while True:
                if number == index:
                    p = curNode.next
                    curNode.next = p.next
                    p.next.prior = curNode
                    self.linklength -= 1
                    curNode = head
                    break
                else:
                    curNode = curNode.next
                    number += 1


if __name__ == '__main__':
    func = FunctionLink()
    doublelk = func.creatLinkListHead([1, 2, 3, 4])
    func.printLinkList(doublelk)
    func.inserLinkList(2, 10, doublelk)
    func.printLinkList(doublelk)
    func.deleteLinkList(2, doublelk)
    func.printLinkList(doublelk)

结果展示

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

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

相关文章

MDC硬件笔记

学习资源来自华为 MDC210 80pin低速信号接口 4832pin 低速连接器的可插拔次数≤20 MiniFakra 视频接口 MiniFakra 视频连接器的可插拔次数≤ 25 次。 车载以太接口 1、2是100兆,3、4是1000兆 MTB300转接盒 前后面板接口总览: 1 低速接口1 40个…

如何使用Promethues监控系统指标并进行告警

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 前言 从零开始:使用Prometheus与Grafana搭建监控系统 克服网络障碍:Prometheus如何通过间接方式采集目标服务数据 在以上二节,我们介绍了如何使…

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…

re:Invent2023大会隆重推出自研芯片Graviton4和Trainium2

目录 一、前言 二、体验Graviton系列产品 (一)创建普通的EC2实例 (二)创建Graviton处理器的EC2实例 (三)远程到服务器 方式1:创建成功时连接 方式2:SSH客户端 方式3:正确…

airpods 无法使用Windows电脑充电的解决方法

打开设置 -> 蓝牙与其他设备 -> 显示更多设备 往下翻,找到“更多设备与打印机设置”,打开设备界面: 打开" Airpods Case",找到“硬件”选项 -> 双击"符合HID标准的供应商定义设备" -> “驱动程序…

Markdown(轻量级标记语言)基本语法教程

学习总是避免不了记笔记,除了在线的记录一些博客外,也会需要一些不方便在线记录的线下笔记,那么找到一个好用方便的适合记录代码的工具,就很重要,这里给大家分享一下Markdown基本语法,可以很简单的达成我们…

GPT-4.5!!!

GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…

Java21新特性-虚拟线程

虚拟线程是轻量级线程(类似于 Go 中的 “协程(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。 线程是可供调度的最小处理单元,它与其他类似的处理单元并发运行,并且在…

设计模式——责任链模式(行为模式)

引言 责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 问题 假如你正在开发一个在线订购系统。 你希望对系统访问进行限制, 只允…

Rsyslog 8.1901.0 配置Tls模式加密传输log

需求背景:客户需要配置Tls加密模式上传log,老虎动手来搞搞, 推荐看下面的技术文档,官方的没有下面这个好用 https://rsyslog.readthedocs.io/en/latest/tutorials/tls_cert_summary.html 我们可以在github上下载官方文档编译后查看…

OCC 创建简单几何

使用 OCC 创建 正方体和圆柱体&#xff0c;并且通过布尔运算&#xff0c;切除正方体内的圆柱体&#xff0c;保存 stl 几何模型。 #include <iostream> #include <iomanip> #include "BRepPrimAPI_MakeCylinder.hxx" #include "BRepPrimAPI_MakeBox…

Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的命令首…

C++学习笔记(十五)

继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重…

自动封箱打包码垛缠绕流水线案例

广西交投在某地新建工厂后&#xff0c;需要建设一条生产隧道灯&#xff0c;后段自动封箱打包码垛缠绕包装线。 凯隆包装在深入了解客户需求后&#xff0c;结合客户实际生产情况&#xff0c;为客户量身定制了集智能感应系统、产品自动折盖上下封箱、捆扎两道打包带、码垛机械臂自…

windows如何环境搭建属于自己的Zblog博客并发布上线公网访问?

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

2024上半年软考别轻易尝试!先了未发布

最近几年&#xff0c;软件考试变得非常受欢迎&#xff01;不论你的专业、学历或工作时间如何&#xff0c;你都可以报名参加&#xff0c;而且通过考试取得证书还能用来抵扣个人所得税、评职称、帮助落户和参与招投标等等。 身边的朋友们纷纷参加软考&#xff0c;这让我也产生了…

自由撰稿人如何快速记录灵感?随手记录灵感素材的电子记事本

随着互联网的发展&#xff0c;催生了很多新的职业&#xff0c;其中“自由撰稿人”就是很多年轻人正在做的工作。而对于自由撰稿人来说&#xff0c;灵感是创作的源泉。然而&#xff0c;灵感往往稍纵即逝&#xff0c;如何快速记录下来&#xff0c;成为了我们面临的一大挑战。 那…

云原生基础入门概念

文章目录 发现宝藏云原生的概念云原生的关键技术为何选择云原生&#xff1f;云原生的实际应用好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 云原生的概念 当谈及现…

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能&#xff0c;因为Netty默认情况下处理UDP收包只能由一个线程负责&#xff0c;无法像TCP协议那种基于主从reactor模型实现多线程监听端口&#xff0c;所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…

虹科干货 | 克服端口顺序影响,使用 PCAN实现固定设备ID/通道分配

导读&#xff1a;多设备协同工作是常见的需求。然而&#xff0c;适配器的插入顺序可能会影响到设备的识别和访问&#xff0c;给系统管理带来不便。虹科PCAN能够进行固定设备ID/通道分配&#xff0c;确保设备不受适配器插入顺序的影响&#xff0c;提高系统的稳定性和可靠性。本文…