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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python爬虫 urllib2的使用方法详解
Sep 23 Python
python字典排序的方法
Oct 12 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
python re.match()用法相关示例
Jan 27 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/08/08 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
jquery 问答知识整理
2010/02/11 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
express express-session的使用小结
2018/12/12 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python与R语言的简要对比
2017/11/14 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python中如何设置代码自动提示
2020/07/15 Python
销售总监工作职责
2013/11/21 职场文书
安全生产投入制度
2014/01/29 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
教师辞职书范文
2015/02/26 职场文书
个人总结怎么写
2015/02/26 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers