基于python实现双向链表

实现双向链表需要以下几个步骤:

1. 定义节点类

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

链表节点需要存储的信息有:值、上一个节点的引用(即prev),下一个节点的引用(即next)。

2. 初始化链表

class DoubleLinkedList:
    def __init__(self):
        self.head = ListNode()
        self.tail = ListNode()
        self.head.next = self.tail    # 头节点的next指针指向尾节点
        self.tail.prev = self.head    # 尾节点的prev指针指向头节点
        self.length = 0

初始化时需要创建头和尾节点,使其相互指向,并设置初始长度为0。

3. 插入节点

class DoubleLinkedList:
    ...
    def insert(self, val):
        # 创建新节点
        new_node = ListNode(val=val)
        # 新节点的next指向原头节点的next
        new_node.next = self.head.next
        # 原头节点的next的prev指向新节点
        self.head.next.prev = new_node
        # 头节点的next指向新节点
        self.head.next = new_node
        # 新节点的prev指向头节点
        new_node.prev = self.head
        # 长度+1
        self.length += 1

插入节点需要在头节点和第一个节点之间插入。新节点的next指针指向原头节点的next,原头节点的next的prev指针指向新节点,头节点的next指针指向新节点,新节点的prev指针指向头节点,最后将长度加一。

4. 删除节点

class DoubleLinkedList:
    ...
    def delete(self, val):
        cur = self.head.next
        while cur != self.tail:
            if cur.val == val:
                cur.prev.next = cur.next
                cur.next.prev = cur.prev
                self.length -= 1
                return True
            cur = cur.next
        return False

删除节点需要遍历链表,找到对应的节点后,将其前后的节点相互连接,长度减一。如果找不到对应节点则返回False。

示例1:插入节点

my_linked_list = DoubleLinkedList()
my_linked_list.insert(1)
my_linked_list.insert(2)
my_linked_list.insert(3)

执行后my_linked_list的状态如下:

head -> 1 <-> 2 <-> 3 <- tail

示例2:删除节点

my_linked_list = DoubleLinkedList()
my_linked_list.insert(1)
my_linked_list.insert(2)
my_linked_list.insert(3)
my_linked_list.delete(2)

执行后my_linked_list的状态如下:

head -> 1 <-> 3 <- tail

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

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

相关文章

  • html-定位:after伪元素

    HTML定位:after伪元素的完整攻略 在HTML中,我们可以使用:after伪元素来为元素添加额外的内容,并使用定位属性来控制其位置。本文将介绍如何使用:after伪元素进行定位,并提供两个示例说明。 骤1:创建HTML元素 首先,我们需要创建一个HTML元素,以便为其添加:after伪元素。可以按照以下步骤创建元: <div class=&quo…

    other 2023年5月8日
    00
  • 基于PostgreSql 别名区分大小写的问题

    基于PostgreSQL 别名区分大小写的问题攻略 在PostgreSQL中,别名是用于给表、列或函数等数据库对象起一个替代的名称。默认情况下,PostgreSQL是不区分别名的大小写的,这意味着你可以使用任何大小写组合来引用别名。然而,有时候我们可能需要在别名中区分大小写。下面是解决这个问题的完整攻略。 步骤1:创建区分大小写的别名 要创建区分大小写的别名…

    other 2023年8月16日
    00
  • vue长按事件

    当然,我很乐意为您提供有关“Vue长按事件”的完整攻略。以下是详细的步骤和两个示例: 1 Vue长按事件 Vue长按事件是一种在Vue应用程序中实现长按操作的方法。以下是使用Vue长按事件的步骤: 1.1 安装vue-touch 首先,您需要安装vue-touch。您可以使用以下命令在Vue应用程序中安装vue-touch: npm install vue-…

    other 2023年5月6日
    00
  • 远程SSH连接服务与基本排错经验总结

    远程SSH连接服务与基本排错经验总结 何为SSH? Secure Shell(缩写为SSH),它是一种加密的网络协议,可以在网络上安全地运行各种网络服务,例如远程登录和远程文件传输。 远程SSH连接服务简介 要连接到远程SSH服务,需要使用SSH客户端,如OpenSSH(常见于Linux和Mac操作系统)和PuTTY(常见于Windows系统)。 Linux…

    other 2023年6月27日
    00
  • 学习使用jquery iScroll.js移动端滚动条插件

    学习使用jQuery iScroll.js移动端滚动条插件的完整攻略 iScroll.js是一个基于jQuery的移动端滚动条插件,可以添加水平或垂直滚动条,支持惯性滚动、滑动时动态加载数据等功能,而且非常适合移动端网站的使用。下面将详细介绍学习使用iScroll.js的完整攻略。 步骤一:引入iScroll.js 在使用iScroll.js之前,需要先引入…

    other 2023年6月27日
    00
  • C语言实现单链表的基本功能详解

    C语言实现单链表的基本功能详解 简介 单链表是一种常见的数据结构,由一系列的节点(Node)组成,每个节点包含数据和指向下一个节点的指针,最后一个节点的指针为NULL。C语言实现单链表需要掌握指针和动态内存分配的知识,具有一定难度。本文将详细讲解C语言实现单链表的基本功能。 基本结构 定义单链表结点的结构体,包括数据和指向下一个结点的指针,如下所示: typ…

    other 2023年6月27日
    00
  • Android高级开发之性能优化典范

    Android高级开发之性能优化典范 性能优化是Android开发中非常重要的一环,可以提升应用的响应速度、降低资源消耗,提升用户体验。以下是Android高级开发中的性能优化典范的完整攻略,包含两个示例说明。 1. 减少内存使用 内存使用是影响应用性能的重要因素之一。以下是几个减少内存使用的方法: 使用SparseArray代替HashMap:Sparse…

    other 2023年10月15日
    00
  • Win11右键菜单太大怎么办?Win11右键菜单大小调整方法

    以下是详细的Win11右键菜单大小调整方法完整攻略。 问题描述 在Win11系统中,当我们在桌面或文件资源管理器中右键点击时,弹出的右键菜单可能会显示得过大,这可能会影响我们使用电脑的效率和体验。那么,如何调整Win11右键菜单的大小呢? 方法一:使用“调整所有的菜单尺寸”选项 一种解决方法是通过Windows 11的“调整所有的菜单尺寸”选项来调整右键菜单…

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