Python实现双向链表:从基础到应用

一、引言

        双向链表是一种比单向链表更复杂的数据结构,每个节点除了包含数据和指向下一个节点的指针外,还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始,向前或向后遍历链表。

目录

一、引言

二、节点定义

三、链表实现

四、链表操作

五、应用示例

下面是一个使用双向链表类的示例:

输出结果为: 

总结



二、节点定义

  • 首先,我们需要定义一个双向链表的节点类(Node),它包含数据成员、指向前一个节点的指针和指向下一个节点的指针。


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

三、链表实现

  • 接下来,我们定义一个双向链表类(DoublyLinkedList),它包含头节点、尾节点和一系列操作链表的方法。
class DoublyLinkedList:  def __init__(self):  self.head = None  self.tail = None  def append(self, value):  new_node = Node(value)  if not self.head:  self.head = new_node  self.tail = new_node  else:  new_node.prev = self.tail  self.tail.next = new_node  self.tail = new_node  def prepend(self, value):  new_node = Node(value)  if not self.head:  self.head = new_node  self.tail = new_node  else:  new_node.next = self.head  self.head.prev = new_node  self.head = new_node  def delete(self, value):  current = self.head  while current:  if current.data == value:  if current == self.head and current == self.tail:  self.head = None  self.tail = None  elif current == self.head:  self.head = current.next  self.head.prev = None  elif current == self.tail:  self.tail = current.prev  self.tail.next = None  else:  current.prev.next = current.next  current.next.prev = current.prev  return True  current = current.next  return False  def print_list(self):  current = self.head  while current:  print(current.data, end=" ")  current = current.next  print()

四、链表操作

  • 在双向链表类中,我们实现了几个基本操作:append(在尾部添加新节点)、prepend(在头部添加新节点)、delete(删除指定值的节点)和print_list(打印链表中的所有元素)。

五、应用示例

  • 下面是一个使用双向链表类的示例:
doubly_linked_list = DoublyLinkedList()  
doubly_linked_list.append(3)  
doubly_linked_list.append(2)  
doubly_linked_list.prepend(1)  
doubly_linked_list.prepend(0)  print("链表中的元素为:", end=" ")  
doubly_linked_list.print_list()  doubly_linked_list.delete(2)  print("删除元素2后的链表为:", end=" ")  
doubly_linked_list.print_list()

  • 输出结果为: 
链表中的元素为: 0 1 3 2   
删除元素2后的链表为: 0 1 3

总结

        双向链表是一种功能强大的数据结构,它允许我们在两个方向上遍历链表,提供了更多的操作灵活性。在实际应用中,双向链表常用于实现双向队列、双向栈等数据结构,以及需要高效插入、删除和遍历操作的场景。

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

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

相关文章

OPPO打响AI手机第一枪

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 2024开年,AI趋势依旧高歌猛进。 一边,Sora爆火成为现象级AIGC应用,带动AI再度成为春节后全民热议的第一话题。另一边,手机厂商开始大举All in AI,“放弃传统智能手机”、“…

【Qt】Sqlite数据库加密

1. 加密方式 对数据库文件加密。既不会暴露表结构,也不会暴露数据细节。 2. 加密工具(QtCipherSqlitePlugin) 用于密码 SQLite 的 Qt 插件,它基于 SQLite 源和 wxWidget 中的 wxSQLite3插件github地址:https://gith…

gpt-3.5-turbo与星火认知大模型v3.5回答对比

创建kernel // Create a kernel with OpenAI chat completionKernel kernel Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId:"使用的模型id" ,apiKey: "APIKey").Build();使用讯飞星火认知大模型的话,可以参考我这一篇文章&#xff…

c++函数指针 回调函数

目录 函数指针 ​编辑 实例 函数指针作为某个函数的参数 实例 std::function轻松实现回调函数 绑定一个函数 作为回调函数 作为函数入参 函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向…

【Java】UWB高精度工业定位系统项目源代码

目录 UWB技术原理 优势 1. 高精度: 2. 抗干扰能力强: 3. 定位范围广: 4. 实时性强: 应用前景 定位系统源码功能介绍 实时定位: 轨迹回放: 区域管理: 巡检管理: 数据可视化分析&…

BAT等大厂必问技术面试题,2024Android开发面试解答之设计模式

IT行业薪水高,这是众所周知的,所以很多人大学都选择IT相关专业,即使非该专业的人,毕业了也想去一个培训机构镀镀金,进入这一行业。 但是有关这个行业35岁就退休的说法,也一直盛传。 加上这几年不断有各大…

回溯 Leetcode 47 全排列II

全排列II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 Leetcode 47 学习记录自代码随想录 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]] 示例 2: 输入&#xff1…

Unity3d Shader篇(十)— 渐变纹理

文章目录 前言一、什么是Unlity渐变纹理Shader?1. 渐变纹理Shader工作原理2. 渐变纹理?3. 渐变纹理的优缺点优点:缺点: 4. 渐变纹理例图 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函…

(二十二)devops持续集成开发——jenkins服务代理Agent搭建

前言 在Jenkins 中,代理(Agent)是一种用于执行构建、部署和其他任务的计算节点。代理节点可以是物理机器、虚拟机或容器,它们负责接收 Jenkins 主控节点委派的任务并执行这些任务。通过使用代理节点,可以有效地分担Je…

NLP Seq2Seq模型

🍨 本文为[🔗365天深度学习训练营学习记录博客🍦 参考文章:365天深度学习训练营🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mi…

深入理解Linux线程(LWP):概念、结构与实现机制(2)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:会いたい—Naomile 1:12━━━━━━️💟──────── 4:59 🔄 ◀️ ⏸ ▶️ ☰ &a…

Vue3+vite打包后页面空白问题

vite.config.js vite.config.js 增加 base: ./ import { fileURLToPath, URL } from node:url import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({base: ./,resolve: {alias: {: fileURLToPath…

解析短视频美颜SDK:美颜美型技术的深度剖析

美颜并非简单的滤镜叠加,而是依托着先进的图像处理和人工智能技术,才能够达到如此出色的效果。本文将深入探讨短视频美颜SDK背后的技术原理和实现方法,从而揭示其美颜美型技术的深度剖析。 一、美颜SDK的基本原理 美颜SDK的基本原理是通过对…

java 企业培训管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 企业培训管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

UCWSC

feature fusion neural network based on a decomposition mechanism (FFDM) 辅助信息 作者未提供代码

学习大数据,所必需的java基础(6)

文章目录 集合Set集合介绍HashSet集合的介绍和使用LinkedHashSet的介绍以及使用哈希值哈希值的计算方式HashSet的存储去重的过程 Map集合Map的介绍HashMap的介绍以及使用HashMap的两种遍历方式方式1:获取key,然后再根据key获取value方式2:同时…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

Python实现PPT演示文稿中视频的添加、替换及提取

无论是在教室、会议室还是虚拟会议中,PowerPoint 演示文稿都已成为一种无处不在的工具,用于提供具有影响力的可视化内容。PowerPoint 提供了一系列增强演示的功能,在其中加入视频的功能可以大大提升整体体验。视频可以传达复杂的概念、演示产…

ArkTS中的路由跳转和HTTP数据请求

路由跳转 步骤1:找到箭头所指的文件,在其中添加已创建的页面 步骤2:导包 步骤3: HTTP数据请求 步骤1:导包 > import http from ohos.net.http; 步骤2:(如果需要在页面加载前请求&#xf…