Python实现双向链表

yizhihongxing

Python实现双向链表

双向链表是一种常见的线性数据结构,它允许在任意位置插入、删除、查找节点,具有很好的灵活性和效率。本篇文章将介绍Python如何实现双向链表,包括链表的节点定义、插入删除操作的实现、以及几个示例来说明如何使用双向链表。

链表节点定义

首先,我们需要定义一个双向链表的节点类。节点包含三个属性:前一个节点的指针prev、当前节点的值val、下一个节点的指针next。

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

双向链表的插入操作

在双向链表中,我们可以在指定位置插入一个新节点。插入节点的基本操作包括以下几步:

  1. 新建一个节点;
  2. 将前一个节点的next指向新节点;
  3. 将新节点的prev指向前一个节点,将新节点的next指向后一个节点;
  4. 将后一个节点的prev指向新节点。

具体实现如下:

class DoublyLinkedList:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.head = None
        self.tail = None
        self.size = 0

    def addAtIndex(self, index: int, val: int) -> None:
        if index < 0 or index > self.size:  # 处理非法索引
            return

        if index == 0:  # 在头部插入
            self.addAtHead(val)
        elif index == self.size:  # 在尾部插入
            self.addAtTail(val)
        else:
            node = Node(val)
            curr = self.head
            for i in range(index - 1):
                curr = curr.next
            node.prev = curr  # 1. 将前一个节点的next指向新节点
            node.next = curr.next  # 2. 将新节点的prev指向前一个节点,将新节点的next指向后一个节点
            curr.next.prev = node  # 3. 将后一个节点的prev指向新节点
            curr.next = node
            self.size += 1

双向链表的删除操作

在双向链表中,我们可以在指定位置删除一个节点。删除节点的基本操作包括以下几步:

  1. 将前一个节点的next指向后一个节点;
  2. 将后一个节点的prev指向前一个节点。

具体实现如下:

class DoublyLinkedList:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.head = None
        self.tail = None
        self.size = 0

    def deleteAtIndex(self, index: int) -> None:
        if index < 0 or index >= self.size:  # 处理非法索引
            return

        if index == 0:  # 删除头部节点
            self.head = self.head.next
            if self.head:  # 注意判断链表是否为空
                self.head.prev = None
            else:
                self.tail = None
        elif index == self.size - 1:  # 删除尾部节点
            self.tail = self.tail.prev
            self.tail.next = None
        else:
            curr = self.head
            for i in range(index):
                curr = curr.next
            curr.prev.next = curr.next  # 1. 将前一个节点的next指向后一个节点
            curr.next.prev = curr.prev  # 2. 将后一个节点的prev指向前一个节点
        self.size -= 1

示例说明

我们来看两个使用示例。

示例1:删除链表中的节点

dll = DoublyLinkedList()
dll.addAtHead(1)
dll.addAtTail(3)
dll.addAtIndex(1, 2)
dll.deleteAtIndex(1)
print(dll.head.val)  # 1
print(dll.head.next.val)  # 3

首先,创建一个双向链表,插入三个节点,值分别为1、2、3。然后,删除第二个节点,即值为2的节点。最后,打印链表头部节点和头部节点的下一个节点,结果分别为1、3。

示例2:反转双向链表

dll = DoublyLinkedList()
dll.addAtHead(1)
dll.addAtTail(3)
dll.addAtIndex(1, 2)

# 反转链表
new_head = dll.tail
while new_head:
    print(new_head.val)
    new_head = new_head.prev

首先,创建一个双向链表,插入三个节点,值分别为1、2、3。然后,使用while循环反转链表,按照逆序打印链表节点的值。最后的输出结果为3、2、1,说明链表已经被成功反转。

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

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

相关文章

  • 被称为同步神器的btsync 你可以怎么用?

    被称为同步神器的btsync 你可以怎么用? btsync是一款同步工具,被誉为同步神器。它使用点对点技术,不需要任何服务器或者云存储空间,能够实现多设备之间的文件同步,包括Windows、Linux、Mac、Android等操作系统。 安装btsync 在使用btsync前,我们需要先安装btsync客户端。可以到官网下载对应操作系统的btsync客户端,…

    其他 2023年3月29日
    00
  • windows系统开机出现Supervisory.exe应用程序错误怎么办?

    Windows系统开机出现Supervisory.exe应用程序错误的解决方法 当Windows系统启动时,如果出现“Supervisory.exe应用程序错误”的提示,说明系统中的Supervisory.exe应用程序出现问题,需要进行处理。本文章将详细讲解如何解决此问题。 原因分析 Supervisory.exe是一款由安全厂商推出的应用程序,其主要作用…

    other 2023年6月25日
    00
  • 解析php根据ip查询所在地区(非常有用,赶集网就用到)

    解析PHP根据IP查询所在地区攻略 1. 获取IP地址 首先,我们需要获取用户的IP地址。在PHP中,可以使用$_SERVER[‘REMOTE_ADDR’]来获取用户的IP地址。例如: $ip = $_SERVER[‘REMOTE_ADDR’]; 2. 查询IP所在地区 接下来,我们需要使用一个IP地址库来查询IP所在的地区。有很多第三方IP地址库可以使用,…

    other 2023年7月31日
    00
  • Java实现按照大小写字母顺序排序的方法

    Java实现按照大小写字母顺序排序的方法 在Java中,可以使用java.util.Collections类的sort方法来按照大小写字母顺序对字符串进行排序。下面是一个完整的攻略,包含了两个示例说明。 示例1:对字符串数组进行排序 import java.util.Arrays; import java.util.Collections; public c…

    other 2023年8月17日
    00
  • 我的电脑右键显示处理器和安装内存不可用的解决办法

    解决电脑右键显示“处理器”和“安装内存”不可用的方法 当我们在使用电脑时,有时会遇到无法访问“处理器”和“安装内存”选项的问题,这主要是由于系统权限不足或者系统文件损坏等原因导致的。本文将详细讲解如何解决这个问题。以下是两个实例。 示例1:管理员权限 首先,我们需要确保当前用户拥有管理员权限。因为对于一些敏感的系统选项,它们只能被管理员账户访问和更改。 首先…

    other 2023年6月27日
    00
  • elasticsearch——分页查询

    以下是关于“Elasticsearch——分页查询”的完整攻略,包括基本概念、查询方式、示例说明和注意事项。 基本概念 Elasticsearch是一基于Lucene的分布式搜索引擎,可以快速地存储、搜索和分析大量数据。分页查询是Elasticsearch中常用查询方式之一,可以将查询结果分页展示,提高用户体验。 查询方式 Elasticsearch中分页查…

    other 2023年5月7日
    00
  • webmvcconfigureradapter详解和过时后的替代方案

    当然,我很乐意为您提供有关“WebMvcConfigurerAdapter详解和过时后的替代方案”的完整攻略。以下是详细的步骤和两个示例: 1. WebMvcConfigurerAdapter是什么? WebMvcConfigurerAdapter是Spring MVC框架中的一个类,用于配置Spring MVC的行为。它提供了许多方法,可以用于配置拦截器、…

    other 2023年5月6日
    00
  • springboot配置文件读取pom文件信息方式

    Spring Boot 是一个基于Spring框架的快速开发脚手架。使用Spring Boot 可以非常方便地开发Spring应用程序,并且避免手动配置等繁琐工作。 当我们在使用 Spring Boot 开发应用程序时,需要访问项目的 pom.xml 文件中的一些信息,例如应用程序的名称、版本号、打包方式等等。这些信息可以在 application .yml…

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