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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
详解Python的Django框架中的模版继承
Jul 16 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
python生成ppt的方法
Jun 07 Python
利用Django-environ如何区分不同环境
Aug 26 Python
Python装饰器简单用法实例小结
Dec 03 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
Pandas数据结构之Series的使用
Mar 31 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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
改变Apache端口等配置修改方法
2008/06/05 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
windows下ipython的安装与使用详解
2016/10/20 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
营销总经理岗位职责
2014/02/02 职场文书
致共产党员倡议书
2014/04/16 职场文书
户外活动总结
2015/02/04 职场文书
班主任培训研修日志
2015/11/13 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python