双向链表:实现、操作与分析【算法 17】

双向链表:实现、操作与分析

请添加图片描述

引言

双向链表(Doubly Linked List)是链表数据结构的一种重要形式,它允许节点从两个方向进行遍历。与单向链表相比,双向链表中的每个节点不仅包含指向下一个节点的指针(或引用),还包含指向前一个节点的指针(或引用)。这种结构使得双向链表在插入和删除节点时更加灵活和高效,特别是在需要频繁访问前驱节点的情况下。

双向链表的实现

节点定义

首先,我们需要定义双向链表的节点。每个节点包含三个部分:存储的数据、指向下一个节点的指针(或引用)以及指向前一个节点的指针(或引用)。

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

双向链表类

接下来,我们定义双向链表类,包含初始化链表、插入节点、删除节点、遍历链表等基本操作。

class DoublyLinkedList:  def __init__(self):  self.head = None  self.tail = None  def append(self, value):  """在链表末尾添加节点"""  new_node = ListNode(value)  if not self.head:  self.head = self.tail = new_node  else:  self.tail.next = new_node  new_node.prev = self.tail  self.tail = new_node  def prepend(self, value):  """在链表开头添加节点"""  new_node = ListNode(value)  if not self.head:  self.head = self.tail = new_node  else:  self.head.prev = new_node  new_node.next = self.head  self.head = new_node  def delete_node(self, node):  """删除指定节点"""  if not node:  return  if node.prev:  node.prev.next = node.next  else:  self.head = node.next  if node.next:  node.next.prev = node.prev  else:  self.tail = node.prev  def print_list(self):  """打印链表"""  current = self.head  while current:  print(current.value, end=" ")  current = current.next  print()

双向链表的操作

插入操作

  • append(value): 在链表末尾添加新节点。
  • prepend(value): 在链表开头添加新节点。

删除操作

  • delete_node(node): 删除指定的节点。需要传入要删除的节点对象。

遍历操作

  • print_list(): 遍历链表并打印每个节点的值。

双向链表的分析

优点

  1. 灵活性:双向链表允许从两个方向遍历,使得插入和删除操作更加灵活。
  2. 高效性:在已知前驱节点或后继节点的情况下,插入和删除操作的时间复杂度为O(1)。

缺点

  1. 空间复杂度:每个节点需要额外的空间来存储前驱节点的指针,增加了空间开销。
  2. 指针管理:在插入和删除节点时,需要维护更多的指针关系,增加了实现的复杂性。

结论

双向链表是一种强大的数据结构,适用于需要频繁进行节点插入和删除操作,并且需要快速访问前驱和后继节点的场景。通过合理的实现和操作,我们可以充分利用双向链表的优点,同时避免其缺点带来的问题。希望本文能帮助你更好地理解和使用双向链表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/429772.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目: 题解: #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…

旋转机械故障数据集 全网首发

旋转机械故障 数据集 11G资料 泵、齿轮箱、电机、流量、液压系统、轴承(西储大学、辛辛那提大学、FEMTO、MOSFET)、PHM08挑战数据集、我闪发动机降级模拟数据集、铣床等 旋转机械故障数据集 数据集描述 该数据集是一个综合性的旋转机械故障检测和诊断数据集,旨在…

【QT】系统-下

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QTheadrun() 👉🏻QMutex👉🏻QWaitCondition👉🏻Q…

C/C++内存管理 ——

目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式:malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…

分布式事务详细笔记:什么是分布式事务--Seata--XA模式--AT模式

目录 1.分布式事务 1.1.什么是分布式事务 1.2.认识Seata 1.3.部署TC服务 1.3.1.准备数据库表 1.3.2.准备配置文件 1.3.3.Docker部署 1.4.微服务集成Seata 1.4.1.引入依赖 1.4.2.改造配置 1.4.3.添加数据库表 1.5.XA模式 1.5.1.两阶段提交 1.5.2.Seata的XA模型 1…

网络原理 HTTP与HTTPS协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多计算机网络知识 目录 1.HTTP概念 2.HTTP报文格式 3.HTTP请求 1.首行 1.1URL 1.2 GET⽅法 1.3 POST⽅法 1.4 其他⽅法 2.请求头(head…

专业学习|动态规划(概念、模型特征、解题步骤及例题)

一、引言 (一)从斐波那契数列引入自底向上算法 (1)知识讲解 (2)matlap实现递归 (3)带有备忘录的遗传算法 (4)matlap实现带有备忘录的递归算法 “&#xff1…

使用库函数点亮一个LED灯

软件设计 STM32Gpio的介绍 如果想让LED0点亮,那么R12就要是高电平,LED0就要是低电平,也就是PF9就是低电平 F407系统主频要工作在168MHZ F103的话是工作在72mhz F429的话就180MHZ 接着我们就要使能Gpio的时钟,使能之后对GPIO相关…

c++----io流

提示:以下 是本篇文章正文内容,下面案例可供参考 1.标准io流 (1)数据的循环输入 对于内置类型:cin和cout直接使用,c已经重载了 (2)对于自定义类型: 需要我们自己对类型进行重载 2.文件io流 ifstream ifile(只输入…

着色器 简介

着色器(Shader)是运行在 GPU 上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间…

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序,致敬全 A 的答案,和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数,就想到了二分。然后写一个判…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展:回归与回溯 中序遍历图解 首先看下中序遍历的代码,其接受一个根结点root作为参数,判断根节点是否为nil,不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

ArcGIS核密度分析(栅格处理范围与掩膜分析)

多时候我们在进行栅格分析的时候,处理的结果不能完全覆盖我们需要的范围。 比如,我们对点数据进行密度分析、栅格插值等。比如下图 为什么会如此呢? 那是因为在做这个密度分析或者栅格插值的时候,默认是以点的四至范围来生成的&am…

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…

探索 Web Speech API:实现浏览器语音识别与合成

引言 Web Speech API 是一项由 W3C 开发的 Web 标准,为开发者提供了在 Web 应用程序中实现语音识别和语音合成的能力。通过 Web Speech API,我们可以让网页与用户进行语音交互,实现更加智能化和便捷的用户体验。本文将深入探讨 Web Speech A…

第十二周:机器学习

目录 摘要 Abstract 一、非监督学习 二、word embedding 三、transformer 1、应用 2、encoder 3、decoder 四、各类attention 1、最常见的类别 2、其余种类 3、小结 总结 摘要 本周继续学习机器学习的相关课程,首先了解了监督学习和非监督学习的概…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境,然后将 jobId 添加到 slf4j 的 MDC 容器中,随后任务输出的日志都将附带 joid。 MDC 介绍如下: MDC ( Mapped Diagnostic Contexts ),它是一个…

文件操作和InputStream,OutputStream的用法

“他越拧巴,我越喜欢!” 文件: 此处谈到的文件,本身有很多的含义。 狭义上的文件,特指 硬盘上的文件(以及保存文件的目录)。 广义上的文件,计算机上的很多硬件设备,软…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支,切换到该分支下面,输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支,因为刚刚提交的分支在dev环境,所以master是没有 3、合并分支 点击push,将dev里面的代码合并到…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍😋 input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…