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 相关文章推荐
利用python写个下载teahour音频的小脚本
May 08 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 Python
python向字符串中添加元素的实例方法
Jun 28 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
Dec 11 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
python扫描线填充算法详解
Feb 19 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Python中递归以及递归遍历目录详解
Oct 24 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
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
浅析JavaScript异步代码优化
2019/03/18 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
python处理数据,存进hive表的方法
2018/07/04 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
python 递归相关知识总结
2021/03/03 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
个人实用简单的自我评价
2013/10/19 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
移交协议书
2014/08/19 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
抗洪救灾标语
2014/10/08 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书