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入门篇之面向对象
Oct 20 Python
python算法演练_One Rule 算法(详解)
May 17 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
利用python如何在前程无忧高效投递简历
May 07 Python
详解python pandas 分组统计的方法
Jul 30 Python
python实现统计代码行数的小工具
Sep 19 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python几种酷炫的进度条的方式
Apr 11 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
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
小议javascript 设计模式 推荐
2009/10/28 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python3获取当前目录的实现方法
2019/07/29 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
煤矿安全生产月活动总结
2014/07/05 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
股权转让协议范本
2014/12/07 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书