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抓取网页正文的源码
Jun 11 Python
Python中的zip函数使用示例
Jan 29 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
Python实现App自动签到领取积分功能
Sep 29 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
Django app配置多个数据库代码实例
Dec 17 Python
python 深度学习中的4种激活函数
Sep 18 Python
Python中random模块常用方法的使用教程
Oct 04 Python
python中time、datetime模块的使用
Dec 14 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 xfocus防注入资料
2008/04/27 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP6新特性分析
2016/03/03 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
安装Python的教程-Windows
2017/07/22 Python
详解python的ORM中Pony用法
2018/02/09 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
Python批量发送post请求的实现代码
2018/05/05 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python制作词云图代码实例
2019/09/09 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python实现简易淘宝购物
2019/11/22 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
财务学生的职业生涯发展
2014/02/11 职场文书
课外访万家心得体会
2014/09/03 职场文书
同学聚会通知短信
2015/04/20 职场文书
行为规范主题班会
2015/08/13 职场文书