python实现数据结构中双向循环链表操作的示例


Posted in Python onOctober 09, 2020

看此博客之前建议先看看B站的视频python数据结构与算法系列课程,该课程中未实现双向循环链表的操作,所以我按照该视频的链表思路实现了双向循环链表的操作,欢迎大家阅读与交流,如有侵权,请联系博主!

下面附上代码:

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


class DoubleCycleLinkList:
  def __init__(self, node=None):
    self.__head = node

  def is_empty(self):
    """判空"""
    if self.__head is None:
      return True
    return False

  def length(self):
    """链表长度"""
    if self.is_empty():
      return 0
    cur = self.__head
    count = 1
    while cur.next is not self.__head:
      count += 1
      cur = cur.next
    return count

  def travel(self):
    """遍历链表"""
    if self.is_empty():
      return
    cur = self.__head
    while cur.next is not self.__head:
      print(cur.elem, end=" ")
      cur = cur.next
    print(cur.elem, end=" ")
    print("")

  def add(self, elem):
    """头插法"""
    node = Node(elem)
    if self.is_empty():
      self.__head = node
      node.prev = node
      node.next = node
    else:
      self.__head.prev.next = node
      node.prev = self.__head.prev
      node.next = self.__head
      self.__head.prev = node
      self.__head = node

  def append(self, elem):
    """尾插法"""
    node = Node(elem)
    if self.is_empty():
      self.__head = node
      node.prev = node
      node.next = node
    else:
      node.next = self.__head
      node.prev = self.__head.prev
      self.__head.prev.next = node
      self.__head.prev = node

  def insert(self, pos, elem):
    """任一位置(pos)插入, 下标从0数起"""
    if pos <= 0:
      self.add(elem)
    elif pos > (self.length() - 1):
      self.append(elem)
    else:
      count = 0
      cur = self.__head
      node = Node(elem)
      while count < (pos - 1):
        count += 1
        cur = cur.next
      node.next = cur.next
      node.prev = cur
      node.next.prev = node
      cur.next = node

  def remove(self, elem):
    """删除某一节点,若有多个符合条件的节点,删除第一个即可"""
    if self.is_empty():
      return
    cur = self.__head
    while cur.next is not self.__head:
      if cur.elem == elem:
        if cur is self.__head:
          self.__head = cur.next
          cur.prev.next = cur.next
          cur.next.prev = cur.prev
        else:
          cur.prev.next = cur.next
          cur.next.prev = cur.prev
        break
      cur = cur.next
    if cur.elem == elem:
      cur.prev.next = self.__head
      self.head = cur.prev

  def search(self, elem):
    """查找某一个节点"""
    if self.is_empty():
      return False
    cur = self.__head
    while cur.next is not self.__head:
      if cur.elem == elem:
        return True
      cur = cur.next
    # while中处理不到尾节点,所以进行最后尾节点的判断
    if cur.elem == elem:
      return True
    return False

到此这篇关于python实现数据结构中双向循环链表操作的示例的文章就介绍到这了,更多相关python 双向循环链表操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python学习手册中的python多态示例代码
Jan 21 Python
python处理图片之PIL模块简单使用方法
May 11 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python脚本处理空格的方法
Aug 08 Python
从0开始的Python学习016异常
Apr 08 Python
python动态进度条的实现代码
Jul 03 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
Python文件操作基础流程解析
Mar 19 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
python turtle绘图命令及案例
Nov 23 Python
Python collections模块的使用方法
Oct 09 #Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 #Python
Python中Selenium模块的使用详解
Oct 09 #Python
python利用platform模块获取系统信息
Oct 09 #Python
python smtplib发送多个email联系人的实现
Oct 09 #Python
python 决策树算法的实现
Oct 09 #Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 #Python
You might like
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php开发微信支付获取用户地址
2015/10/04 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
js读取cookie方法总结
2014/10/31 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
js module大战
2019/04/19 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
高中的职业生涯规划书
2013/12/28 职场文书
运动会拉拉队口号
2014/06/09 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
2014年施工员工作总结
2014/11/18 职场文书
2014会计年终工作总结
2014/12/20 职场文书
计生个人工作总结
2015/02/28 职场文书
农业项目投资意向书
2015/05/09 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers