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 os模块介绍
Nov 30 Python
python基础教程之五种数据类型详解
Jan 12 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
Python3实现的简单验证码识别功能示例
May 02 Python
基于数据归一化以及Python实现方式
Jul 11 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
django的model操作汇整详解
Jul 26 Python
python的scipy实现插值的示例代码
Nov 12 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
python中@contextmanager实例用法
Feb 07 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入门源程序
2006/10/09 PHP
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
15种PHP Encoder的比较
2007/04/17 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
nginx 设置多个站跨域
2021/03/09 Servers
jquery 插件 人性化的消息显示
2008/01/21 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
python制作花瓣网美女图片爬虫
2015/10/28 Python
python实现自动发送邮件
2018/06/20 Python
Python实现多线程的两种方式分析
2018/08/29 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
python实发邮件实例详解
2019/11/11 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
公司董事长助理工作职责
2014/07/12 职场文书
六查六看六改心得体会
2014/10/14 职场文书
护士医德考评自我评价
2015/03/03 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
士兵突击观后感
2015/06/16 职场文书
小学教师读书笔记
2015/07/01 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript