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使用cookie库操保存cookie详解
Mar 03 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
Python3常用内置方法代码实例
Nov 18 Python
Python进程池Pool应用实例分析
Nov 27 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Python3如何判断三角形的类型
Apr 12 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
Python参数传递实现过程及原理详解
May 14 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
python 如何引入协程和原理分析
Nov 30 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中header的用法详解
2013/06/07 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
event.srcElement+表格应用
2006/08/29 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
javascript中length属性的探索
2011/07/31 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python中encode()方法的使用简介
2015/05/18 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
python中如何使用insert函数
2020/01/09 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
大学学年自我鉴定
2013/10/28 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
党员党性分析材料
2014/02/17 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
护理目标管理责任书
2014/07/25 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
自主招生专家推荐信
2015/03/26 职场文书
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python