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

这篇文章主要介绍了Python实现的单向循环链表功能,简单描述了单向循环链表的概念、原理并结合实例形式分析了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  (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编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

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

相关推荐:

卡厄思梦境时间循环boss怎么打

《卡厄思梦境》是一款幻想题材角色扮演游戏,玩家将作为领航者带领人类和各个不同种族的战员,那么有不少小伙伴好奇时间循环boss怎么打,下面就来告诉大家时间循环boss打法攻略。 卡厄思梦境时间循环boss怎么打 一、时间循环双BOSS基础介绍 时间循环周挑战副本包含两名核心BOSS,分别是嚎叫浪子(尼希隆)与面对的恐惧(戴奥斯),两名BOSS机制各异、抗压和爆发能力极强,对队伍输出、走位和阵容搭配都...

《卡厄思梦境》时间循环boss打法攻略

卡厄思梦境时间循环boss怎么打?卡厄思梦境可以让每个成员都进入到二次元世界,开启挑战,面对大量的暗黑Boss,玩家可以通过不断输出对抗赢得挑战胜利,接下来要带来,卡厄思梦境国服时间循环BOSS打法,时间循环boss指的也就是游戏周挑战里面的boss,两个boss的战力都非常强,关于对应的打法攻略,接下来会做出简单的分享介绍,想顺利完成对战的玩家不要错过。 《卡厄思梦境》时间循环boss打法攻略 ...

天工AI写个人简介提示词怎么加示例,结果更稳定

加示例显著提升天工AI生成个人简介质量——它能对齐语言节奏、信息密度和人设颗粒度;不加则套用空洞模板。因天工AI无记忆,需用真实自写段落或正反对比样例明确风格坐标,再嵌入角色、背景与硬约束。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 天工AI生成个人简介时加不加示例,输出质量差异非常明显——没示例时它常套用空洞的“本人性格开朗、责任心强...

DeepSeek写脚本运行示例提示词怎么写,才能复制就能执行

必须以if name == "__main__":开头并调用main(),显式import所有依赖,输入用sys.argv[1]或input(),输出仅print纯文本,禁用可视化和交互语法,脚本可直接python script.py运行。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 要让DeepSeek生成的Python脚本复制后无需修...

即梦AI写短剧片段提示词怎么加示例,结果更稳定

即梦AI生成短剧需精准提示:首句锁定角色全貌与锚定指令,分镜按秒或镜头号写清动作链、情绪细节、道具物理逻辑及结尾终止态,确保不跳脸、不穿帮、有叙事节奏。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 想让即梦AI生成的短剧片段角色不跳脸、动作不穿帮、镜头有叙事节奏,光写“男主生气转身离开”这种笼统描述根本不行,必须把人物、时间、镜头、动作、...
· AI · 227412

iPhone怎么查看电池循环次数?苹果手机电池健康度深度查询

iPhone电池循环次数可通过五种方法查询:一、设置→电池→电池健康与充电(仅iPhone 15+ iOS 17.4+);二、“关于本机”底部隐藏字段(部分旧机型);三、快捷指令解析分析日志(全机型);四、爱思助手或CoconutBattery等电脑工具;五、macOS系统信息→电源(需配对Mac)。 如果您希望了解 iPhone 当前电池已使用的完整充放电循环次数,以评估其物理老化程度和剩余服役...

iPhone怎么查看电池循环次数 苹果手机不连接电脑查电池寿命【技巧】

iPhone电池循环次数可直接在手机端查询:iPhone 15及更新机型在“设置→电池→电池健康与充电”中查看;iPhone 14及更早机型可尝试“设置→通用→关于本机”底部查找;全机型还可通过开启分析共享后用快捷指令解析日志,或使用App Store审核通过的第三方电池应用获取。 如果您希望了解 iPhone 当前电池已完成的完整充放电循环次数,以评估其物理使用强度和老化程度,且不依赖电脑连接,...

千问在做Few-shot学习的时候给几个示例效果最好?提示工程技巧

优化千问Few-shot提示需动态配置示例数量、按上下文窗口反向推算上限、筛选高相关性示例、实施位置加权排序、开展质量驱动的迭代验证。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在使用千问(Qwen)进行Few-shot学习时发现模型输出不稳定或泛化能力不足,则可能是由于示例数量设置不当导致上下文干扰或模式识别失效。以下是针对千问...