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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
Python全局变量操作详解
Apr 14 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
Python操作json的方法实例分析
Dec 06 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
python 如何在list中找Topk的数值和索引
May 20 Python
python自动化八大定位元素讲解
Jul 09 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函数
2006/10/09 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
jQuery 1.0.2
2006/10/11 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
jquery图片切换插件
2015/03/16 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
python清除字符串里非字母字符的方法
2015/07/02 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL