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 代码效率的方法
Jul 03 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
python opencv之分水岭算法示例
Feb 24 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
python实现微信打飞机游戏
Mar 24 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
Python字符串查找基本操作代码案例
Oct 27 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Python基础详解之邮件处理
Apr 28 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 Python
Pygame Time时间控制的具体使用详解
Nov 17 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
Python读取实时数据流示例
2019/12/02 Python
python函数定义和调用过程详解
2020/02/09 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
兼职学生的自我评价
2013/11/24 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
餐饮营销方案
2014/02/23 职场文书
农林环境专业求职信
2014/03/13 职场文书
教师考核评语
2014/04/28 职场文书
舞蹈专业求职信
2014/06/13 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
行政处罚告知书
2015/07/01 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python