热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Python中的循环双向链表数据结构

本文详细探讨了Python中循环双向链表的数据结构,包括其定义、特点及应用场景。文章首先介绍了循环双向链表的基本概念,随后深入分析了其核心操作,如节点的插入、删除和遍历等。最后,通过具体的Python代码示例,展示了如何高效地实现这些操作,帮助读者全面理解并掌握这一重要数据结构。

文章目录

    • 前言
    • 1. 循环双链表
    • 2. 基本操作
    • 3. 代码实现


前言

  本篇章主要介绍线性表中的循环双链表,并用Python实现其基本操作。


1. 循环双链表

  循环双链表就是循环单链表和双链表的集合体了。
在这里插入图片描述


2. 基本操作


















































操作名称操作说明
InsertInHead(val_list)头插法创建循环双链表
InsertInTail(val_list)尾插法创建循环双链表
IsEmpty()判断循环双链表是否为空
LengthList()返回循环双链表的长度
TraverseList()打印出循环双链表里的数据元素
InsertInPosition(pos, data)在指定位置插入
SearchWithPosition(pos)按位置查找结点
SearchWithVal(data)按值查找结点
RemoveWithPosition(pos)移除指定位置的结点
RemoveWithVal(data)移除指定值的结点

3. 代码实现

class CircularDoubleLinkList(object):def __init__(self):self.__head = DoubleLinkNode(None)self.__head.next = self.__headdef InsertInHead(self, val_list):"""头插法:param val_list::return:"""prehead = self.__headfor val in val_list:new_node = DoubleLinkNode(val)if self.IsEmpty():prehead.next = new_nodenew_node.prior = preheadnew_node.next = self.__headself.__head.prior = new_nodeelse:new_node.next = prehead.nextprehead.next.prior = new_nodeprehead.next = new_nodenew_node.prior = preheaddef InsertInTail(self, val_list):"""尾插法:param val_list::return:"""prehead = self.__headfor val in val_list:new_node = DoubleLinkNode(val)prehead.next = new_nodenew_node.prior = preheadnew_node.next = self.__headself.__head.prior = new_nodeprehead = prehead.nextdef IsEmpty(self):"""判断循环双链表是否为空, 空表返回True:return:"""if self.__head.next == self.__head:return Truedef LengthList(self):"""返回循环双链表的长度:return:"""prehead = self.__headcount = 0if self.IsEmpty():return countwhile prehead.next != self.__head:count += 1prehead = prehead.nextreturn countdef TraverseList(self):"""遍历循环双链表, 并打印:return:"""prehead = self.__headif self.IsEmpty():print('链表为空!')return 0while prehead.next != self.__head:prehead = prehead.nextprint(prehead.data, end=' ')print('')def InsertInPosition(self, pos, data):"""在某个位置插入:param pos: [1, LengthSingleLinkList + 1]:param data::return:"""prehead = self.__headnew_node = DoubleLinkNode(data)if pos <= 0 or pos > self.LengthList() + 1:print('插入位置错误!')return 0count = 0while count < pos - 1:prehead = prehead.nextcount += 1if prehead.next != self.__head:new_node.next = prehead.nextprehead.next.prior = new_nodeelse:new_node.next = self.__headself.__head.prior = new_nodenew_node.prior = preheadprehead.next = new_nodedef SearchWithPosition(self, pos):"""按位置查找元素:param pos: [1, LengthSingleLinkList]:return:"""prehead = self.__headif pos <= 0 or pos > self.LengthList():print('位置错误!')return -1count = 0while count < pos:prehead = prehead.nextcount += 1data = prehead.datareturn datadef SearchWithVal(self, data):"""按值查找元素:param data::return:"""prehead = self.__headcount = 0while prehead.next != self.__head:prehead = prehead.nextcount += 1if prehead.data == data:return countprint('该节点不存在!')return -1def RemoveWithPosition(self, pos):"""按位置移除元素:param pos: [1, LengthSingleLinkList]:return:"""prehead = self.__headif pos <= 0 or pos > self.LengthList():print('位置错误!')return 0count = 0while count < pos - 1:prehead = prehead.nextcount += 1temp = prehead.nextif temp.next == self.__head:prehead.next = self.__headself.__head.prior = preheadelse:prehead.next = temp.nexttemp.next.prior = preheaddel tempdef RemoveWithVal(self, data):"""按值移除元素:param data::return:"""prehead = self.__headwhile prehead.next != self.__head:prehead = prehead.nextif prehead.data == data:if prehead.next == self.__head:prehead.prior.next = self.__headself.__head.prior = prehead.priorelse:prehead.prior.next = prehead.nextprehead.next.prior = prehead.priorreturn -1print('该节点不存在!')

  测试代码如下:

from LinkList import CircularDoubleLinkListif __name__ == '__main__':l1 = CircularDoubleLinkList()print('头插法创建循环双链表l1: ', end='')l1.InsertInHead([1, 3, 5, 7])l1.TraverseList()l2 = CircularDoubleLinkList()print('尾插法创建循环双链表l2: ', end='')l2.InsertInTail([1, 3, 5, 7])l2.TraverseList()print('链表l2的长度为: %d' % l2.LengthList())print('在链表l2的第3个位置上插入值为2的节点: ', end='')l2.InsertInPosition(3, 2)l2.TraverseList()print('链表l2的第4个位置上的节点的值为: %d' % l2.SearchWithPosition(4))print('链表l2值为7的节点的位置为: %d' % l2.SearchWithVal(7))print('移除链表l2的第5个位置上的节点: ', end='')l2.RemoveWithPosition(5)l2.TraverseList()print('移除链表l2值为1的节点: ', end='')l2.RemoveWithVal(1)l2.TraverseList()

  运行结果如下:

在这里插入图片描述


推荐阅读
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 在使用sbt构建项目时,遇到了“对象apache不是org软件包的成员”的错误。本文详细分析了该问题的原因,并提供了有效的解决方案,包括检查依赖配置、清理缓存和更新sbt插件等步骤,帮助开发者快速解决问题。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • Java新手求助:如何优雅地向心仪女生索要QQ联系方式(附代码示例与技巧)
    在端午节后的闲暇时光中,我无意间在技术社区里发现了一篇关于如何巧妙地向心仪女生索取QQ联系方式的文章,顿时感到精神焕发。这篇文章详细介绍了源自《啊哈!算法》的方法,不仅图文并茂,还提供了实用的代码示例和技巧,非常适合 Java 新手学习和参考。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
author-avatar
知无不言之歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有