python实现双向链表原理

Python实现双向链表原理

双向链表是一种非常经典的数据结构,它的每一个节点都有两个指针,一个指向前驱节点,一个指向后继节点。相对于单向链表,双向链表能够快速地在任意位置插入或删除元素,因此被广泛地应用于实际场景中。

Python语言提供了很多数据结构类型,包括列表、字典、集合等等。但是在某些情况下,双向链表也能够更好地满足我们的需求。本篇文章将详细介绍Python实现双向链表的原理及代码实现。

双向链表的结构

首先,我们需要定义一个双向链表的节点类。它需要包含三个属性:valueprevnext。其中,value表示节点存储的值,prev表示前驱节点,next表示后继节点。代码如下所示:

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

然后,我们需要定义一个双向链表类。它需要包含两个属性:headtail。其中,head表示双向链表的头节点,tail表示双向链表的尾节点。代码如下所示:

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

在双向链表中,每一个节点都有一个前驱节点和一个后继节点。因此,我们需要实现向双向链表中添加节点的方法 add_node,它需要按照正确的顺序往链表中插入节点。我们可以定义三种情况:

  1. 链表为空,直接将节点插入到头部即可;
  2. 链表非空,节点需要插入到头部;
  3. 链表非空,节点需要插入到中间或者尾部。

代码如下所示:

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    # 向链表中添加节点
    def add_node(self, value):
        # 创建新节点
        new_node = Node(value)

        # 链表为空,直接将节点插入到头部
        if self.head is None:
            self.head = new_node
            self.tail = new_node

        # 链表非空,节点需要插入到头部
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node

在双向链表中,每一个节点都有一个前驱节点和一个后继节点。因此,我们需要实现从双向链表中删除节点的方法 remove_node,它需要按照正确的顺序将节点从链表中删除。我们可以定义三种情况:

  1. 链表为空,无需进行任何操作;
  2. 链表仅有一个元素,直接将头部和尾部节点清空即可;
  3. 链表非空,需要删除中间或者尾部的节点。

代码如下所示:

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    # 向链表中添加节点
    def add_node(self, value):
        # 创建新节点
        new_node = Node(value)

        # 链表为空,直接将节点插入到头部
        if self.head is None:
            self.head = new_node
            self.tail = new_node

        # 链表非空,节点需要插入到头部
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node

    # 从链表中删除节点
    def remove_node(self, value):
        # 链表为空,无需进行任何操作
        if self.head is None:
            return

        # 链表仅有一个元素,直接将头部和尾部节点清空即可
        elif self.head == self.tail and self.head.value == value:
            self.head = None
            self.tail = None

        # 链表非空,需要删除中间或者尾部的节点
        else:
            curr_node = self.head
            while curr_node:
                # 找到匹配的节点,删除它
                if curr_node.value == value:
                    # 中间节点
                    if curr_node.prev and curr_node.next:
                        curr_node.prev.next = curr_node.next
                        curr_node.next.prev = curr_node.prev

                    # 尾部节点
                    elif curr_node == self.tail:
                        self.tail = curr_node.prev
                        curr_node.prev.next = None

                    # 头部节点
                    else:
                        self.head = curr_node.next
                        curr_node.next.prev = None

                    del curr_node
                    break

                curr_node = curr_node.next

示例说明

示例 1:添加节点

以下是通过双向链表添加 1、2、3 三个节点后的链表结构:

doubly_linked_list = DoublyLinkedList()
doubly_linked_list.add_node(3)
doubly_linked_list.add_node(2)
doubly_linked_list.add_node(1)

print(doubly_linked_list.head.value)  # 1
print(doubly_linked_list.head.next.value)  # 2
print(doubly_linked_list.head.next.next.value)  # 3

print(doubly_linked_list.tail.value)  # 3
print(doubly_linked_list.tail.prev.value)  # 2
print(doubly_linked_list.tail.prev.prev.value)  # 1

示例 2:删除节点

以下是通过双向链表删除 2 节点后的链表结构:

doubly_linked_list = DoublyLinkedList()
doubly_linked_list.add_node(3)
doubly_linked_list.add_node(2)
doubly_linked_list.add_node(1)

doubly_linked_list.remove_node(2)

print(doubly_linked_list.head.value)  # 1
print(doubly_linked_list.head.next.value)  # 3
print(doubly_linked_list.tail.value)  # 3
print(doubly_linked_list.tail.prev.value)  # 1

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现双向链表原理 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 怎么看win10是否为9926版本?查看win10版本号的三种方法

    当你想要确定你的Windows 10操作系统是否为9926版本时,可以使用以下三种方法来查看版本号: 使用系统设置: 点击任务栏上的“开始”按钮,然后点击“设置”图标(齿轮状图标)。 在“设置”窗口中,点击“系统”选项。 在左侧导航栏中,选择“关于”选项。 在右侧窗口中,你将看到“Windows规格”部分,其中包含了你的Windows 10版本号。 示例说明…

    other 2023年8月2日
    00
  • Win10正式版exFAT文件系统回归 解决U盘/SD卡大文件支持

    让我来详细讲解一下Win10正式版exFAT文件系统回归,解决U盘/SD卡大文件支持的完整攻略,具体步骤如下: 第一步:检查Windows10版本 在开始进行exFAT文件系统的回归前,首先需要检查Windows10的版本是否支持exFAT文件系统。只有Windows10 1709版本或更高版本才支持exFAT文件系统。因此,您需要确保您的Windows10…

    other 2023年6月27日
    00
  • ASP常见的保留字整理(变量与表名注意不能用)

    ASP常见的保留字整理(变量与表名注意不能用) 在ASP中,有一些保留字是不能用作变量名或表名的。这些保留字在ASP中具有特殊的含义,使用它们作为变量名或表名可能会导致语法错误或意外的行为。下面是一些常见的ASP保留字的整理: Response – Response 是一个ASP对象,用于向客户端发送输出。它具有许多方法和属性,如Write、Redirect…

    other 2023年8月9日
    00
  • .NET医院公众号系统线程CPU双高问题分析

    .NET医院公众号系统线程CPU双高问题分析攻略 1. 问题背景 在医院公众号系统中,出现线程CPU双高问题可能导致系统性能下降,甚至出现系统崩溃的情况。本攻略将详细讲解如何分析和解决这个问题。 2. 攻略步骤 步骤一:确认问题 首先,我们需要确认系统是否存在线程CPU双高问题。可以通过以下步骤进行确认: 监控系统资源:使用系统监控工具(如Windows任务…

    other 2023年7月27日
    00
  • QQ、TM无法启动,提示“应用程序无法启动,因为应用程序的并行配置不正确”的解决方法

    为了解决QQ、TM无法启动,提示“应用程序无法启动,因为应用程序的并行配置不正确”的问题,我们可以按照下面的步骤进行操作。 初步检查 首先,我们需要检查自己的电脑是否完全符合QQ、TM的系统要求。例如,QQ和TM需要在Windows 7或更高版本的操作系统上运行。同时,你需要确保你的电脑上已经安装了所有必要的软件和组件,例如.NET Framework。 重…

    other 2023年6月25日
    00
  • iqoo3如何开启开发者选项 iqoo3开启开发者选项方法

    iQOO3如何开启开发者选项 iQOO3是一款搭载了Android操作系统的智能手机,开启开发者选项可以让用户获得更多的操作权限和调试功能。下面我们详细讲解iQOO3开启开发者选项的方法。 步骤一:进入设置界面 首先,点击手机桌面上的“设置”图标,进入手机设置。 步骤二:打开关于手机 在设置界面中,向下滑动找到“关于手机”选项并点击进入。 步骤三:点击版本号…

    other 2023年6月26日
    00
  • 360安全卫士提示不认识IP地址?怎么更改常用ip地址?

    360安全卫士提示不认识IP地址?怎么更改常用IP地址? 如果你在使用360安全卫士时遇到了提示不认识IP地址的问题,你可以按照以下步骤来更改常用IP地址。 步骤一:打开360安全卫士设置 首先,打开360安全卫士软件。你可以在任务栏或桌面上找到它的图标,双击打开。 步骤二:进入网络设置 在360安全卫士的主界面上,找到并点击“设置”按钮。这通常位于界面的右…

    other 2023年7月30日
    00
  • C++超详细梳理基础知识

    C++超详细梳理基础知识攻略 一、C++语言简介 C++是一种面向对象的编程语言,在C语言的基础上增加了一些特性,包括类、对象、继承、多态等。 为了更好地进行学习,可以先了解以下几个方面: 1.1 C++编译器 C++代码需要由编译器进行编译,生成可执行文件或动态库/静态库。常用的编译器有g++、Clang++、Visual C++等。不同编译器的语法可能有…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部