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字符串替换的2种方法
Nov 30 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
用Python读取几十万行文本数据
Dec 24 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
python多线程案例之多任务copy文件完整实例
Oct 29 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Python序列化与反序列化相关知识总结
Jun 08 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
Python超详细分步解析随机漫步
Mar 17 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实现堆排序原理及实例详解
2020/06/19 PHP
js模拟类继承小例子
2010/07/17 Javascript
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
JavaScript正则表达式和级联效果
2017/09/14 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python修改操作系统时间的方法
2015/05/18 Python
python中__slots__用法实例
2015/06/04 Python
Python实现把数字转换成中文
2015/06/29 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
通过python爬虫赚钱的方法
2019/01/29 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
学习Python爬虫的几点建议
2020/08/05 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
迟到检讨书5000字
2014/01/31 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
升职感谢信
2015/01/22 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
MySQL8.0的WITH查询详情
2021/08/30 MySQL
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers