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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
Python文件操作类操作实例详解
Jul 11 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
python查看模块安装位置的方法
Oct 16 Python
python线程中的同步问题及解决方法
Aug 29 Python
python求绝对值的三种方法小结
Dec 04 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
tensorflow常用函数API介绍
Apr 19 Python
浅析Python迭代器的高级用法
Jul 16 Python
详解Python生成器和基于生成器的协程
Jun 03 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/15 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
python基础教程之lambda表达式使用方法
2014/02/12 Python
Python中的id()函数指的什么
2017/10/17 Python
Python的多维空数组赋值方法
2018/04/13 Python
Python如何发布程序的详细教程
2018/10/09 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
单位介绍信范文
2014/01/18 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
汇报材料怎么写
2014/12/30 职场文书
内乡县衙导游词
2015/02/05 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
MySQL创建索引需要了解的
2021/04/08 MySQL
详解MySQL中的主键与事务
2021/05/27 MySQL
如何利用Python实现一个论文降重工具
2021/07/09 Python