热门标签 | 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()

  运行结果如下:

在这里插入图片描述


推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 使用Python计算文件的CRC32校验值
    本文记录了一次对路由器固件分析时,如何利用Python计算文件的CRC32校验值。文中提供了完整的代码示例,并详细解释了实现过程。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
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社区 版权所有