Python实现的单向循环链表功能示例


Posted in Python onNovember 10, 2017

本文实例讲述了Python实现的单向循环链表功能。分享给大家供大家参考,具体如下:

概述:

单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空。

Python实现的单向循环链表功能示例

由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头。

操作

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

具体代码:

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
    # 若头节点的元素就是要查找的元素item
    if cur.item == item:
      # 如果链表不止一个节点
      if cur.next != self._head:
        # 先找到尾节点,将尾节点的next指向第二个节点
        while cur.next != self._head:
          cur = cur.next
        # cur指向了尾节点
        cur.next = self._head.next
        self._head = self._head.next
      else:
        # 链表只有一个节点
        self._head = None
    else:
      pre = self._head
      # 第一个节点不是要删除的
      while cur.next != self._head:
        # 找到了要删除的元素
        if cur.item == item:
          # 删除
          pre.next = cur.next
          return
        else:
          pre = cur
          cur = cur.next
      # cur 指向尾节点
      if cur.item == item:
        # 尾部删除
        pre.next = cur.next
  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()

运行结果:

Python实现的单向循环链表功能示例

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

Python 相关文章推荐
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
Tensorflow 查看变量的值方法
Jun 14 Python
分析python请求数据
Aug 19 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python随机数函数代码实例解析
Feb 09 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 #Python
浅谈Python处理PDF的方法
Nov 10 #Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 #Python
python使用邻接矩阵构造图代码示例
Nov 10 #Python
python先序遍历二叉树问题
Nov 10 #Python
简单了解OpenCV是个什么东西
Nov 10 #Python
python的文件操作方法汇总
Nov 10 #Python
You might like
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
Python获取服务器信息的最简单实现方法
2015/03/05 Python
详解Python中的多线程编程
2015/04/09 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Python 的类、继承和多态详解
2017/07/16 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
学院书画协会部门职责
2013/11/28 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
《比的意义》教学反思
2016/02/18 职场文书
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL