广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于python实现双向链表
  • 379
分享到

基于python实现双向链表

2024-04-02 19:04:59 379人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、构建链表节点二、实现链表类三、测试逻辑在一些面试或者力扣题中都要求用双向链表来实现,下面是基于python的双向链表实现。 一、构建链表节点 class node:    

在一些面试或者力扣题中都要求用双向链表来实现,下面是基于python的双向链表实现。

一、构建链表节点

class node:

    def __init__(self, key, value):
        """
        初始化方法
        :param key:
        :param value:
        """
        self.key = key
        self.value = value
        self.prev = None
        self.next = None

    def __str__(self):
        val = '{%s: %s}' % (self.key, self.value)
        return val

    def __repr__(self):
        val = '{%s: %s}' % (self.key, self.value)
        return val

除了一些节点的基础属性外还有__str__方法用于自定义print(node)的字符串描述(类似Java的toString()),__repr__用于自定义直接调用Node类时的字符串描述

二、实现链表类

具体逻辑主要包括头部添加、尾部添加、头部删除、尾部删除和任意节点的删除,所有对双向链表的操作都是基于这几个方法实现的,具体流程都写在注释中了

class DoubleLinkedList:

    def __init__(self, capacity=0xffffffff):
        """
        双向链表
        :param capacity: 链表容量 初始化为int的最大值2^32-1
        :return:
        """
        self.capacity = capacity
        self.size = 0
        self.head = None
        self.tail = None

    def __add_head(self, node):
        """
        向链表头部添加节点
            头部节点不存在 新添加节点为头部和尾部节点
            头部节点已存在 新添加的节点为新的头部节点
        :param node: 要添加的节点
        :return: 已添加的节点
        """
        # 头部节点为空
        if not self.head:
            self.head = node
            self.tail = node
            self.head.next = None
            self.tail.prev = None
        # 头部节点不为空
        else:
            node.next = self.head
            self.head.prev = node
            self.head = node
            self.head.prev = None
        self.size += 1

        return node

    def __add_tail(self, node):
        """
        向链表尾部添加节点
            尾部节点不存在 新添加的节点为头部和尾部节点
            尾部节点已存在 新添加的节点为新的尾部节点
        :param node: 添加的节点
        :return: 已添加的节点
        """
        # 尾部节点为空
        if not self.tail:
            self.tail = node
            self.head = node
            self.head.next = None
            self.tail.prev = None
        # 尾部节点不为空
        else:
            node.prev = self.tail
            self.tail.next = node
            self.tail = node
            self.tail.next = None
        self.size += 1

        return node

    def __remove_head(self):
        """
        删除头部节点
            头部节点不存在 返回None
            头部节点已存在 判断链表节点数量 删除头部节点
        :return: 头部节点
        """
        # 头部节点不存在
        if not self.head:
            return None

        # 链表至少存在两个节点
        head = self.head
        if head.next:
            head.next.prev = None
            self.head = head.next
        # 只存在头部节点
        else:
            self.head = self.tail = None
        self.size -= 1

        return head

    def __remove_tail(self):
        """
        删除尾部节点
            尾部节点不存在 返回None
            尾部节点已存在 判断链表节点数量 删除尾部节点
        :return: 尾部节点
        """
        # 尾部节点不存在
        if not self.tail:
            return None

        # 链表至少存在两个节点
        tail = self.tail
        if tail.prev:
            tail.prev.next = None
            self.tail = tail.prev
        # 只存在尾部节点
        else:
            self.head = self.tail = None
        self.size -= 1

        return tail

    def __remove(self, node):
        """
        删除任意节点
            被删除的节点不存在 默认删除尾部节点
            删除头部节点
            删除尾部节点
            删除其他节点
        :param node: 被删除的节点
        :return: 被删除的节点
        """
        # 被删除的节点不存在
        if not node:
            node = self.tail

        # 删除的是头部节点
        if node == self.head:
            self.__remove_head()
        # 删除的是尾部节点
        elif node == self.tail:
            self.__remove_tail()
        # 删除的既不是头部也不是尾部节点
        else:
            node.next.prev = node.prev
            node.prev.next = node.next
            self.size -= 1

        return node

    def pop(self):
        """
        弹出头部节点
        :return: 头部节点
        """
        return self.__remove_head()

    def append(self, node):
        """
        添加尾部节点
        :param node: 待追加的节点
        :return: 尾部节点
        """
        return self.__add_tail(node)

    def append_front(self, node):
        """
        添加头部节点
        :param node: 待添加的节点
        :return: 已添加的节点
        """
        return self.__add_head(node)

    def remove(self, node=None):
        """
        删除任意节点
        :param node: 待删除的节点
        :return: 已删除的节点
        """
        return self.__remove(node)

    def print(self):
        """
        打印当前链表
        :return:
        """
        node = self.head
        line = ''
        while node:
            line += '%s' % node
            node = node.next
            if node:
                line += '=>'
        print(line)

三、测试逻辑

if __name__ == '__main__':
    double_linked_list = DoubleLinkedList(10)
    nodes = []
    # 构建十个节点的双向列表
    for i in range(10):
        node_item = Node(i, i)
        nodes.append(node_item)

    double_linked_list.append(nodes[0])
    double_linked_list.print()
    double_linked_list.append(nodes[1])
    double_linked_list.print()
    double_linked_list.pop()
    double_linked_list.print()
    double_linked_list.append_front(nodes[2])
    double_linked_list.print()
    double_linked_list.append(nodes[3])
    double_linked_list.print()
    double_linked_list.remove(nodes[3])
    double_linked_list.print()
    double_linked_list.remove()
    double_linked_list.print()

测试结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 基于python实现双向链表

本文链接: https://www.lsjlt.com/news/118361.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于python实现双向链表
    目录一、构建链表节点二、实现链表类三、测试逻辑在一些面试或者力扣题中都要求用双向链表来实现,下面是基于python的双向链表实现。 一、构建链表节点 class Node:    ...
    99+
    2022-11-11
  • 基于Java实现双向链表
    本文实例为大家分享了Java实现双向链表的具体代码,供大家参考,具体内容如下 双向链表与单链表的对比: 1、单向链表查找只能是一个方向,双向链表可以向前或者向后查找2、单向链表不能自...
    99+
    2022-11-13
  • python基于双向链表实现LFU算法
    本文实例为大家分享了python实现LFU算法的具体代码,供大家参考,具体内容如下 在第一节中实现了双向链表DoubleLinkedList类,上一节中基于双向链表实现了LRU算法,...
    99+
    2022-11-12
  • Python实现双向链表基本操作
    双向链表的基本操作的实现,供大家参考,具体内容如下 在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工...
    99+
    2022-11-11
  • Python实现双向链表
    之前写的单向链表和环形链表都只是单向的,只能单向遍历,不能根据后面的节点获取前面的节点,除非进行反转操作。 双向链表每个节点都有两个指针,这两个指针分别指向前后两个节点,这样就可以从...
    99+
    2022-11-11
  • Python 实现双向链表(图解)
    双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 双向链表基本方法实现(Python) 1...
    99+
    2023-01-31
    双向 链表 Python
  • python实现双向链表原理
    双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另...
    99+
    2022-11-11
  • python双向链表怎么实现
    这篇文章主要介绍“python双向链表怎么实现”,在日常操作中,相信很多人在python双向链表怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python双向链表怎么实现”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • 怎么用Python实现双向链表
    这篇文章主要介绍“怎么用Python实现双向链表”,在日常操作中,相信很多人在怎么用Python实现双向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现双向链表”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • Java实现双向链表
    本文实例为大家分享了Java实现双向链表的具体代码,供大家参考,具体内容如下 1、双向链表 1.1 双向链表的每个节点组成包含节点数据,上一个节点(pre),下一个节点(next) ...
    99+
    2022-11-13
  • python双向循环链表怎么实现
    本文小编为大家详细介绍“python双向循环链表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“python双向循环链表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。双向循环链表: 将所有的数据存...
    99+
    2023-06-30
  • C语言如何实现双向链表和双向循环链表
    本文小编为大家详细介绍“C语言如何实现双向链表和双向循环链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现双向链表和双向循环链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。双向链表和双向循环链表...
    99+
    2023-06-16
  • python双向链表实例详解
    使用python实现双向链表,供大家参考,具体内容如下 双向链表: 指的是讲数据链接在一起,每个数据是一个节点,每一个节点都有一个数据区,两个链接区,分别链接上一个节点和下一个节点数...
    99+
    2022-11-11
  • python实现双链表
    本文实例为大家分享了python实现双链表的具体代码,供大家参考,具体内容如下 实现双链表需要注意的地方 1、如何插入元素,考虑特殊情况:头节点位置,尾节点位置;一般情况:中间位置2...
    99+
    2022-11-11
  • JAVA中怎么实现链表和双向链表
    这篇文章给大家介绍JAVA中怎么实现链表和双向链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JAVA基础:语言中链表和双向链表的实现(转)[@more@]链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语...
    99+
    2023-06-03
  • java模拟实现双向链表
    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点 下图是双...
    99+
    2022-11-13
  • java代码实现双向链表
    本文实例为大家分享了双向链表java实现代码,供大家参考,具体内容如下 一、双向链表简介 1、单链表的缺陷 单链表只能从头结点开始访问链表中的数据元素,如果需要逆序访问单链表中的数据...
    99+
    2022-11-13
  • C++代码实现双向链表
    本文实例为大家分享了C++实现双向链表的具体代码,供大家参考,具体内容如下 双向链表:两个指针域,一个指向前结点,一个指向后结点 list.h #pragma once #defin...
    99+
    2022-11-13
  • C++怎么实现双向链表
    这篇“C++怎么实现双向链表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么实现双向链表”文章吧。前言:前面文章分析...
    99+
    2023-06-29
  • java双向链表怎么实现
    Java中的双向链表可以通过定义一个Node类来实现,该类包含一个值和两个指针,分别指向前一个节点和后一个节点。具体实现如下: pu...
    99+
    2023-10-22
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作