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 09 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
python遍历序列enumerate函数浅析
Oct 17 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
Python中如何导入类示例详解
Apr 17 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
pandas分批读取大数据集教程
Jun 06 Python
教你怎么用Python监控愉客行车程
Apr 29 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 魔术函数使用说明
2010/02/21 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
jquery uaMatch源代码
2011/02/14 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
sublime text 3配置使用python操作方法
2017/06/11 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
学生个人自我鉴定范文
2014/03/28 职场文书
小学生倡议书范文
2014/05/13 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
项目备案申请报告
2015/05/15 职场文书
听证会主持词
2015/07/03 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书