链表的知识总结

链式结构内存不连续的,而是一个个串起来的,每个链接表的节点保存一个指向下一个节点的指针。

⭐ 链式结构包含:node(节点)还有value(值),由于内存不连续的,那么对于数据的插入,只需找到一个节点便可以插入数据,这也是链表优于列表的一个优点,反之,对于数据的删除,由于不是连续的,不能通过索引删除数据,只能一一遍历删除元素。

⭐ 接下来上代码 单链表的增删功能

定义一个结点的类
class Node():
    def __init__(self,value=None,next=None):
        self.next = next
        self.value = value

    def __str__(self):
        return "Node:{}".format(self.value)

定义一个连接点的类
class Linklist():

    def __init__(self):
        self.root = Node()
        self.size = 0
        self.next = None  # 增加新数据时,将信数据的地址与谁关联

    # 只要是追加 就要创造节点
    def append(self,value):
        node = Node(value)
        # 判断root节点下面是否有数据
        if not self.next: # 如果没有节点
            self.root.next = node  # 将新节点挂在root后面
        else:
            self.next.next = node  # 将新节点挂在最后一个节点上
        self.next = node # 重新赋值 一开始的是None
        self.size += 1

    def append_first(self,value):
        # 只要是追加 就要创造节点
        node = Node(value)
        # 判断root下面是否存在节点
        if not self.next:
            self.root.next = node
            self.next = node
        else:
            temp = self.root.next # 获取原来root后面的那个节点
            self.root.next = node #  将新节点挂在root后面
            node.next = temp # 新的节点的下一个节点是原来的root的节点

    # 迭代链表
    def __iter__(self):
        # 获得root节点下面的数据
        current = self.root.next
        # 判断current是否有之 由于一开始赋予value和next没有值 所以进行判断 否则报错
        if current:
            # 判断时候有下一个节点 有的话则返回下一个结点的值
            while current is not self.next: # self.next可以列结成最后一个节点
                yield current
                current = current.next
            yield current

    # 查找数据
    def find(self,value):
        for n in self.__iter__():
            if n.value == value:
                return n

    # 查找出现的次数
    def find_count(self,value):
        count = 0
        for n in self.__iter__():
            if n.value == value:
                count += 1
        return count

    # 移除数据(链表的移除,需要逐一遍历,找到当前元素的节点,再删除)
    def remove(self,value):
        prve = self.root
        for n in self.__iter__():
            # 判断节点的值与要删除的值是否相等
            if n.value == value:
                # 查看是不是最后一个节点
                if n == self.next:
                    # 更新倒数第二节点的关系
                    prve.next = None
                    # 更新最后一个节点为原倒数第二个节点
                    self.next = prve
                prve.next = None
                # 删除当前节点
                del n
                # 链表大小减少
                self.size -= 1
                return True
            prve = n

    def remove_all(self,value):
        prve =self.root
        for n in self.__iter__():
            if n.value == value:
                if n == self.next:
                    prve.next = None
                    self.next = prve
                prve.next = n.next
                # 删除当前节点
                del n
                # 链表大小减少
                self.size -= 1
                return True
            prve = n

if __name__ == "__main__":
    link = Linklist()
    link.append("孙悟空")
    link.append("猪八戒")
    link.append("孙悟空")
    link.append("猪八戒")
    link.append("猪八戒")
    link.append("唐僧")
    link.append_first("唐僧")
    link.append_first("唐僧")
    # for v in link:
    #     print(v)
    # print(link.find('孙悟空'))
    # print(link.find_count('唐僧'))

    print("**************删除之前的数据******************")
    for v in link:
        print(v)
    link.remove('唐僧')
    link.remove('唐僧')
    link.remove('唐僧')
    link.remove('唐僧')
    link.remove('孙悟空')
    link.remove('猪八戒')

    link.remove_all("猪八戒")
    link.remove_all("孙悟空")
    link.remove_all("唐僧")

    print("**************删除之后的数据******************")
    for v in link:
        print(v)

链表的知识总结

⭐ 接下来上代码 双链表的增删功能:

定义一个结点的类
class Node():
    def __init__(self,value=None,node=None,next=None):
        self.value = value
        self.node = node
        self.next = next
    def __str__(self):
        return "Node:{}".format(self.value)

定义一个连接点的类
class DoubleLinkedList():
    def __init__(self):
        self.root = Node()
        self.size = 0
        self.end = None

    def append(self,value):
        node = Node(value)
        # 判断root节点下面是否有数据
        if not self.end: # 如果没有元素
            self.root.next = node  # 将root 的下一个节点 设置为新的node节点
            node.prev = self.root  # 设置新节点的 上一个节点 为 root
        else:
            self.end.next = node  # 将原来最后节点的下一个节点 设置为新的node节点
            node.prev = self.end # 设置新节点的 上一个节点 为 原来的最后一个节点
        self.end = node # 更新最后 一个节点新加的node节点
        self.size += 1

    def append_first(self,value):
        node = Node(value) # 封装节点对象
        # 判断是否已经有数据
        if not self.end:# 如果没有元素
            self.end = node # 更新最后 一个节点新加的node节点
        else:
            # temp指向node,node指向root,root指向temp
            temp = self.root.next # 保存原来的第一个节点
            node.next = temp # 设置新节的下一个节为原来的 第一个节点
            temp.prev = node # 更新原来的第一个节点的上一个节点位置为 新的node节点
        node.prev = self.root # 设置新节点的 上一个节点 为 root
        self.root.next = node # 将root 的下一个节点 设置为新的node节点
        self.size += 1

    # 正序循环
    def __iter__(self):
        current = self.root.next
        if current:
            while current is not self.end:
                yield current.value
                current = current.next
            yield current.value

    # 倒叙循环
    def revers_iter(self):
        current  = self.end #获取最后一节点
        if current:
            while current is not self.root:
                yield current
                current = current.prev

if __name__ == "__main__":
    link = DoubleLinkedList()
    link.append('孙悟空')
    link.append('猪八戒')
    link.append_first('唐三藏')

    for v in link:
        print(v)

    print('-'*30)

    for v in link.revers_iter():
        print(v)

链表的知识总结

Original: https://www.cnblogs.com/lxxduang/p/16562327.html
Author: 小小程序员-lian
Title: 链表的知识总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622265/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思。 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目。其中,这些服务需要用到Nacos、MyS…

    数据库 2023年6月14日
    086
  • 简述JS正则RegExp对象

    RegExp对象 正则表达式是描述字符模式的对象。 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。 参考教材:w3cschool | JavaScri…

    数据库 2023年6月11日
    087
  • mysql多表关联时可能出错的地方,如搜索出的记录数据变少了。

    当多个表相关联时,就会出现此问题。 [En] This problem occurs when multiple tables are associated.例如其中单位串以单位表…

    数据库 2023年5月24日
    081
  • 多商户商城系统功能拆解26讲-平台端分销设置

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0100
  • MIB MODULE HOST-RESOURCES-MIB

    Textual Conventions Name: BooleanSyntax: Enumerated Name: KBytesSyntax: Integer Range Name…

    数据库 2023年6月11日
    096
  • 无根用户管理podman

    在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置 基础设置 cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资…

    数据库 2023年6月14日
    081
  • 在RAC上部署OGG并配置OGG高可用

    简介 由于业务系统要与大数据平台进行对接,需要将Oracle DB的数据同步到异构数据库上,故选用也不得不用上了Goldengate方案然鹅,OGG在RAC上的HA配置一直众说纷纭…

    数据库 2023年6月16日
    090
  • 关于看源码的心得体会

    前段时间面试,经常遇到面试官在结束的时候问我看过什么开源源码?然后网上对于看源码这块的说法也有各种不同的意见,我进行了总结如下: 不看源码说法: 平常的工作需求、业务忙的一批,哪有…

    数据库 2023年6月6日
    0268
  • DRF补充数据库异常和Redis异常

    DRF补充数据库异常和Redis异常 (1)在项目适当位置新建exceptions.py,内容如下: from rest_framework.views import except…

    数据库 2023年6月14日
    061
  • Ajax

    AJAX(Asynchronous Javascript And Xml) 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL。 点击超链接 提交form表单 使…

    数据库 2023年6月14日
    099
  • 一致性hash算法

    背景 当我们的业务系统大到一定程度的时候,一台缓存服务器显然不能满足需求,需要使用多台缓存服务器。然后缓存服务器具体一定的用户粘性属性,如何设计缓存服务器使其命中率提高,并具有伸缩…

    数据库 2023年6月9日
    086
  • Java学习-第一部分-第二阶段-第八节:IO流

    IO流 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) IO流体系图 文件 什么是文件 文件.对我们并不陌生,文…

    数据库 2023年6月11日
    090
  • 容器化 | 构建 RadonDB MySQL 集群监控平台

    上一篇文章我们演示了如何《在 S3 备份恢复 RadonDB MySQL 集群数据》,本文将演示在 KubeSphere[1] 中使用 Prometheus[2] + Grafan…

    数据库 2023年5月24日
    083
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    数据库 2023年6月11日
    0101
  • Python–Event

    事件Event: 同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变…

    数据库 2023年6月9日
    074
  • Centos MySQL 安装手册(超简洁)

    EL8 系统会遇到 yum报404: Errors during downloading metadata for repository ‘appstream’:原因是2022年1…

    数据库 2023年6月9日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球