python单向循环链表原理与实现方法示例


Posted in Python onDecember 03, 2019

本文实例讲述了python单向循环链表原理与实现方法。分享给大家供大家参考,具体如下:

单向循环链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

python单向循环链表原理与实现方法示例

操作

  • is_empty() 判断链表是否为空
  • length() 返回链表的长度
  • travel() 遍历
  • add(item) 在头部添加一个节点
  • append(item) 在尾部添加一个节点
  • insert(pos, item) 在指定位置pos添加节点
  • remove(item) 删除一个节点
  • search(item) 查找节点是否存在

实现

# -*- coding:utf-8 -*-
#! python3
class Node(object):
  """节点"""
  def __init__(self, item):
    self.item = item
    self.next = None
class SinCycLinkedlist(object):
  """单向循环链表"""
  def __init__(self):
    self.__head = None
  def is_empty(self):
    """判断链表是否为空"""
    return self.__head == None
  def length(self):
    """返回链表的长度"""
    # 如果链表为空,返回长度0
    if self.is_empty():
      return 0
    count = 1
    cur = self.__head
    while cur.next != self.__head:
      count += 1
      cur = cur.next
    return count
  def travel(self):
    """遍历链表"""
    if self.is_empty():
      return
    cur = self.__head
    print(cur.item,)
    while cur.next != self.__head:
      cur = cur.next
      print(cur.item,)
    print("")
  def add(self, item):
    """头部添加节点"""
    node = Node(item)
    if self.is_empty():
      self.__head = node
      node.next = self.__head
    else:
      # 添加的节点指向_head
      node.next = self.__head
      # 移到链表尾部,将尾部节点的next指向node
      cur = self.__head
      while cur.next != self.__head:
        cur = cur.next
      cur.next = node
      # _head指向添加node的
      self.__head = node
  def append(self, item):
    """尾部添加节点"""
    node = Node(item)
    if self.is_empty():
      self.__head = node
      node.next = self.__head
    else:
      # 移到链表尾部
      cur = self.__head
      while cur.next != self.__head:
        cur = cur.next
      # 将尾节点指向node
      cur.next = node
      # 将node指向头节点_head
      node.next = self.__head
  def insert(self, pos, item):
    """在指定位置添加节点"""
    if pos <= 0:
      self.add(item)
    elif pos > (self.length() - 1):
      self.append(item)
    else:
      node = Node(item)
      cur = self.__head
      count = 0
      # 移动到指定位置的前一个位置
      while count < (pos - 1):
        count += 1
        cur = cur.next
      node.next = cur.next
      cur.next = node
  def remove(self, item):
    """删除一个节点"""
    # 若链表为空,则直接返回
    if self.is_empty():
      return
    # 将cur指向头节点
    cur = self.__head
    pre = None
    while cur.next != self.__head:
      if cur.item == item:
        # 先判断此结点是否是头节点
        if cur == self.__head:
          # 头节点的情况
          # 找尾节点
          rear = self.__head
          while rear.next != self.__head:
            rear = rear.next
          self.__head = cur.next
          rear.next = self.__head
        else:
          # 中间节点
          pre.next = cur.next
        return
      else:
        pre = cur
        cur = cur.next
    # 退出循环,cur指向尾节点
    if cur.item == item:
      if cur == self.__head:
        # 链表只有一个节点
        self.__head = None
      else:
        # pre.next = cur.next
        pre.next = self.__head
  def search(self, item):
    """查找节点是否存在"""
    if self.is_empty():
      return False
    cur = self.__head
    if cur.item == item:
      return True
    while cur.next != self.__head:
      cur = cur.next
      if cur.item == item:
        return True
    return False
if __name__ == "__main__":
  ll = SinCycLinkedlist()
  ll.add(1)
  ll.add(2)
  ll.append(3)
  ll.insert(2, 4)
  ll.insert(4, 5)
  ll.insert(0, 6)
  print("length:", ll.length())
  ll.travel()
  print(ll.search(3))
  print(ll.search(7))
  ll.remove(1)
  print("length:", ll.length())
  ll.travel()

运行结果:

length: 6
6
2
1
4
3
5

True
False
length: 5
6
2
4
3
5

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python通过websocket与js客户端通信示例分析
Jun 25 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
详解python3百度指数抓取实例
Dec 12 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
python如何求解两数的最大公约数
Sep 27 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
Oct 24 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
python新手学习可变和不可变对象
Jun 11 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 #Python
Python常用模块os.path之文件及路径操作方法
Dec 03 #Python
Python中顺序表原理与实现方法详解
Dec 03 #Python
python双向链表原理与实现方法详解
Dec 03 #Python
Python读取实时数据流示例
Dec 02 #Python
简单了解python元组tuple相关原理
Dec 02 #Python
python实现智能语音天气预报
Dec 02 #Python
You might like
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
javascript判断非数字的简单例子
2013/07/18 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
Python递归函数定义与用法示例
2017/06/02 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python 接收处理外带的参数方法
2018/12/03 Python
python实现图片彩色转化为素描
2019/01/15 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
Python3如何判断三角形的类型
2020/04/12 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
农民入党思想汇报
2014/01/03 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
个人委托书范本汇总
2014/10/01 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
工作表扬信
2015/01/17 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android