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获取list下标及其值的简单方法
Sep 12 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
python代理工具mitmproxy使用指南
Jul 04 Python
django 类视图的使用方法详解
Jul 24 Python
django的model操作汇整详解
Jul 26 Python
python异步编程 使用yield from过程解析
Sep 25 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 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 Header失效的原因分析及解决方法
2016/11/16 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
json的使用小结
2016/06/08 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
2016/10/21 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
express启用https使用小记
2019/05/21 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
Django 路由控制的实现代码
2018/11/08 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
幼儿园保育员岗位职责
2014/04/13 职场文书
工程承诺书怎么写
2014/05/24 职场文书
高中课程设置方案
2014/05/28 职场文书
创建文明城市倡议书
2015/04/28 职场文书
新教师教学工作总结
2015/08/12 职场文书
尊师重教主题班会
2015/08/14 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技