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 lxml模块安装教程
Jun 02 Python
python文件的md5加密方法
Apr 06 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
python3实现高效的端口扫描
Aug 31 Python
Python实现数值积分方式
Nov 20 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
Python闭包装饰器使用方法汇总
Jun 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
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
PHP Session机制简介及用法
2014/08/19 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
import的本质解析
2017/10/30 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python实现从ftp服务器下载文件
2020/03/03 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
环境科学专业个人求职信
2013/12/15 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
公司离职证明标准样本
2014/10/05 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
导游词格式
2015/02/13 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL