Python 数据库——链表

news2024/12/28 5:31:02

基本概念

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表在逻辑上是连续的,但是在物理空间上可能是不连续的,因为链表的内存都是临时申请的,不一定会申请到连续的内存空间。

常用的链表有单向链表和双向链表。这里主要介绍单项链表。

单项链表的组成节点有两部分构成:数据和下一个列表的存储地址。

单节点结构图:

链表结构图:

可以看到每一个节点中的addr都指向下一个节点的地址,phead为整个链表的头节点,不能改变,否则就会找不到整个链表。

python中实现链表首先需要一个类来实现节点对象

"""
class Node: 创建链表节点
"""


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

这个节点类包含两个属性,value和next。value表示当前节点存储的值,nex表示当前节点指向的下一个节点的地址。

链表的操作

空链表的实现

空链表没有任何节点,只包含了一个head地址,因此可以实现如下:

class DataList:
    def __init__(self):
        self.head = Node(None)

这样一个链表类就写完了,这个类中目前只包含一个空的头指针,其他方法还没有加上去

链表功能

增加链表节点其实都可以用插入节点来统一实现,不管是在头部插入、尾部插入还是中间插入,其本质上都是按index位置来插入值。这里实现尾部插入和按index位置插入两种方法。

尾部插入

  1. 首先要找到链表的尾部在哪里,从上面链表的结构可以看出来最后一个节点的后面是没有节点的,所以最后一个节点的next一定是指向None的,因此可以根据这个特征来找到最后一个节点

p的初始位置为phead,从phead开始遍历

找到尾节点之后p的位置,

然后把新的节点连接在当前p.next上。代码中的while循环就是用来寻找尾节点的。

    def append(self, value):
        """
        在链表结尾增加节点
        """
        p = self.head
        while p.next is not None:
            p = p.next
        p.next = Node(value)

根据index插入

原理和尾部插入类似,先遍历链表,找到需要插入的节点位置,然后插入。

    def insert(self, value, index=0):
        """
            在index的位置插入value值
        :param index: 插入位置,默认为0,插入第一个位置
        :param value: 待插入的值
        :return:
        """
        p = self.head
        node = Node(value)
        for i in range(index):
            print("iteration:"+str(i))
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        node.next = p.next
        p.next = node

查找到index的位置的时候,p的位置如下图:

找到index的位置之后如何将新节点插入?

  1. 首先将新节点的next指向原列表的index所在的节点,也就是p.next
  2. 然后将p.next指向新节点

如果第一步和第二步颠倒过来,则会发生节点p之后的所有链表节点都无法寻找,因为唯一的查询依据p.next已经指向了新节点。

删除节点

原理类似,先查找到index的位置,然后将p.next更改为p.next.next,但是这里需要单独注意一下index=0的情况,因为range(0)不会执行循环,因此需要额外考虑

    def delete(self, index):
        """
        根据index来删除相应的节点
        :param index: 需要删除的节点
        :return:
        """
        p = self.head
        # 当index ==0 时,range循环不会进行,会导致删除第一个元素失败
        if index == 0:
            p.next = p.next.next
            return

        for i in range(index):
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        p.next = p.next.next

修改节点

原理类似,直接上代码

    def modify(self, index, value):
        """
        根据index修改对应的value
        :param index: 需要修改的index
        :param value: 需要更新的值
        :return:
        """
        p = self.head
        for i in range(index):
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        p.next.value = value

最后附上完整的代码

"""
class Node: 创建链表节点
"""


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


"""
class DataList:实现链表的增、删、改、查等功能
"""


class DataList:
    def __init__(self):
        self.head = Node(None)

    def show_all(self):
        """
        显示链表中所有的值
        """
        p = self.head
        while p.next is not None:
            p = p.next
            print(p.value)

    def append(self, value):
        """
        在链表结尾增加节点
        """
        p = self.head
        while p.next is not None:
            p = p.next
        p.next = Node(value)

    def insert(self, value, index=0):
        """
            在index的位置插入value值
        :param index: 插入位置,默认为0,插入第一个位置
        :param value: 待插入的值
        :return:
        """
        p = self.head
        node = Node(value)
        for i in range(index):
            print("iteration:"+str(i))
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        node.next = p.next
        p.next = node

    def delete(self, index):
        """
        根据index来删除相应的节点
        :param index: 需要删除的节点
        :return:
        """
        p = self.head
        # 当index ==0 时,range循环不会进行,会导致删除第一个元素失败
        if index == 0:
            p.next = p.next.next
            return

        for i in range(index):
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        p.next = p.next.next

    def modify(self, index, value):
        """
        根据index修改对应的value
        :param index: 需要修改的index
        :param value: 需要更新的值
        :return:
        """
        p = self.head
        for i in range(index):
            if p.next is not None:
                p = p.next
            else:
                print("index is out of range")
                return
        p.next.value = value





dataList = DataList()
dataList.append(1)
dataList.append(2)
dataList.append(3)
dataList.append(4)
dataList.append(5)
dataList.append(6)

# dataList.insert(7, 1)
# dataList.delete(2)
dataList.modify(2, 1000)
dataList.show_all()

















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

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

相关文章

作物模型与遥感反演值同化建模的程序化实现

目录 专题一 遥感基础理论知识 专题二 作物长势监测与产量估算国内外研究进展 专题三 Fortran编程语言 专题四 作物参数遥感反演基本原理 专题五 PROSAIL模型 专题六 参数敏感性分析 专题七 遥感反演过程中的代价函数求解问题 专题八 基于查找表方法PROSAIL模型的作物参…

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮 效果图代码解析 效果图 代码解析 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons; import { useState, useEffect } from react; import { BASE_URL } from /utils/…

IOMesh 为 KubeVirt 提供高效稳定的持久化存储支持(附用户实践)

7 月 11 日,KubeVirt 社区正式宣布发布 Kubernetes 原生虚拟机管理插件 KubeVirt v1.0。这一版本发布不仅标志着 KubeVirt 已进化为生产就绪的虚拟机管理解决方案,也为正在使用虚拟化环境的用户提供了更多元的云化转型路线:搭配 Kubernetes 持…

vue3的params传参失效的解决方案state

vue3使用vue-router4.0,但是使用router.push的params传参,一直拿不到参数 查阅资料如下: —————————————————————————————————————————— state方案如下: 要传参的组件 import { u…

【C++模拟实现】手撕红黑树(含图解)

【C模拟实现】手撕红黑树(含图解) 目录 【C模拟实现】手撕红黑树(含图解)红黑树的介绍(百度百科)简介特征(十分重要,红黑树的基础) 红黑树的实现代码(insert部…

运营商大数据合作方合作流程和具体服务流程是什么?

运营商大数据合作方合作的流程分为好几个阶段。首先是要进行合作咨询,咨询完成了以后,再直接对相关的数据进行相应的评估。接着再把资源整合起来,然后再对数据进行清洗,接着直接将产品进行包装,然后给数据定价&#xf…

Linux时区配置

Linux时区配置 timedatectl设置时区和时间启用自动同步NTP时间设置UTC或RTC时间查看UTC时间 查看所有可用时区查看当前时区设置系统时区启用夏令时timedatectl修改当前日期时间 通用设置时区方法使用tzselect设置时区 timedatectl设置时区和时间 timedatectl是一个系统工具&am…

解决微信小程序报错:“SyntaxError:Unexpected end of JSON input”

1. 报错原因: 如果对象的参数或数组的元素中遇到地址,地址中包括?、&这些特殊符号时,对象/数组先要通过JSON.stringify转化为字符串再通过encodeURIComponent编码;接收时,先通过decodeURIComponent解码再通过JSON…

成集云 | 聚水潭对接金蝶云星空接口 | 解决方案

源系统成集云目标系统 方案介绍 聚水潭是一款以SaaS ERP为核心,集多种商家服务为一体的SaaS协同平台,为全国35万多家电商企业提供全面的信息化解决方案。聚水潭已在全国设立了超过60个线下服务网点,服务范围覆盖超过300个城市,为…

05目标检测-区域推荐(Anchor机制详解)

目录 一、问题的引入 二、解决方案-设定的anchor boxes 1.高宽比(aspect ratio)的确定 2.尺度(scale)的确定 3.anchor boxes数量的确定 三、Anchor 的在目标检测中是怎么用的 1、anchor boxes对真值bounding box编码的步骤 2、为什么要回归偏移量…

Linux安装jdk11

官网下载链接 https://www.oracle.com/java/technologies/downloads/#java11 下载解压并更改环境变量 export JAVA_HOME/home/jenkins/jdk-11.0.20 PATH"$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin:$PATH"

5G网络优化工程师如何挑选最合适的电脑?

最近很多要来学习5G网络优化的小伙伴都在问小编什么样的电脑会比较合适,开学季嘛电子产品都比较的优惠,想要下手一台性价比较高的笔记本 ,希望小编能够给点建议,于是小编马不停蹄的联系了老师以及就业的学员详细的了解之后&#x…

Error: That port is already in use.

刚开始看后端的内容 经常遇到的问题就是Error: That port is already in use. 解决方法 有两个方法可以解决(假设8000端口被占用): 1. 使用python manage.py runserver 8001 开一个新的端口。 2. kill掉原来的端口(在root条件下)。 在终端输入lsof -i:8000&am…

3dmax 基础操作

基础快捷键 1.放大视图 Altw 2.缩放 滑动滚轮 3.移动物体 按w 移动画布 ctrlp/鼠标中键 4.旋转视图 alt鼠标中键 5.复制 shift移动 6.视图切换 P透视 T顶视图 F前视图 L左视图 7.线框模型显示 f4 8. 只显示线框不显示模型 f3…

多场景PAI-Diffusion中文模型家族大升级,12个模型、2个工具全部开源

作者: 段忠杰、刘冰雁、汪诚愚、邹心怡、黄俊 概述 在过去几年中,随着AI生成内容(AI Generated Content,AIGC)的快速发展,Stable Diffusion模型在该领域崭露头角。阿里云机器学习PAI团队为推动这一领域的…

三、日志编写 —— TinyWebServer

日志编写 —— TinyWebServer 一、 前言 上期已经写完lock类的编写。这期是日志的编写。 对于日志需要弄懂几个基本概念才可以更好的理解和编写日志。 什么是日志?常用的日志级别有哪些?日志的基本格式是什么?异步日志类刷新缓冲区的作用同…

爱尔眼科周进院长出席CCOS 2023并担任学术讲者及培训导师

星城长沙,大咖云集,护航光明,共创未来!9月6日—10日,国内眼科学界最盛大的学术会议——中华医学会第二十七次全国眼科学术大会(CCOS 2023)在湖南长沙隆重举办!逾万名国内外眼科专家、学者代表参加盛会,聚焦眼科发展的新…

骨传导耳机弊端都有哪些?盘点骨传导耳机有哪些缺点!

骨传导耳机有弊端吗?答案是有的!不过由于骨传导耳机的优点大于缺点,所以骨传导耳机的弊端可以忽略不计,下面跟大家说下骨传导耳机都有什么弊端。 1、漏音情况 不管什么耳机,都会存在漏音情况,只是漏音的…

恒运资本:早盘三大指数震荡 减肥药概念再度大涨!

周二(9月12日),A股三大股指震动,涨跌互现。到上午收盘,上证指数涨0.04%,报3144.03点;深证成指涨0.32%,报10415.22;创业板指跌0.10%;沪深两市算计成交额4492.47亿元&#…

C++ 特性模版

目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形…