求链表长度

需要考虑的特殊情况,空链表或者链表当中只有一个节点的时候。

添加元素:

除了头部指向新节点,单向循环链表也需要尾节点指向新的节点

删除元素如下所示:

代码如下所示:

# -*-coding=utf-8-*-
class Node(object):"""单链表的节点"""def __init__(self, elem):# item存放数据元素self.elem = elem# next是下一个节点的标识self.next = Noneclass SingleCycleLinkList(object):"""单链表"""# head是头节点属性,_head在Python中加两个下划线就是私有属性# 这个node是用户传进来的def __init__(self, node=None):self.__head = nodeif node:node.next = nodedef is_empty(self):"""判断是否为空"""return self.__head==Nonedef length(self):"""链表长度"""if self.is_empty():return 0# cur游标,用来移动遍历节点cur = self.__head# count 记录数量count = 1# 尾节点指向self.__head表示循环了一次,当未循环一次未到达尾部时while cur.next != self.__head:count += 1# 将cur后移一个节点cur = cur.nextreturn countdef travel(self):"""遍历整个链表"""#空链表打印if self.is_empty():returncur = self.__headwhile cur.next != self.__head:#添加这个这个,后期打印就不换行了print(cur.elem,end=" ")cur = cur.next#退出循环,cur指向尾节点,但尾结点的元素未打印print(cur.elem)# passdef append(self, item):"""链表尾部添加元素,尾插法"""node = Node(item)# 这个if条件是空链表的意思,我们需要考虑特殊条件# 先判断链表是否为空,若是空链表,则将_head指向新节点if self.is_empty():self.__head = nodenode.next = node# 若不为空,则找到尾部,将尾节点的next指向新节点else:cur = self.__headwhile cur.next != self.__head:cur = cur.nextnode.next = self.__headcur.next = nodedef add(self,item):"""链表头部添加元素,头插法"""# 先创建一个保存item值的节点node = Node(item)if self.is_empty(): #空链表的情况#一般的链表有两个位置,都需要设置一下self.__head = nodenode.next = node #这句话是指向自身的意思else:# 将新节点的链接域next指向头节点,即_head指向的位置cur = self.__headwhile cur.next != self.__head:cur = cur.next#退出循环,cur指向尾节点node.next = self.__headself.__head = node#cur.next = node #这句话跟下面的一句话意思相同,但是不容易理解cur.next = self.__head#中间位置插入元素,不涉及到尾部链接,就是一个单链表的形式#pos是指定的位置,item是保存的元素def insert(self,pos,item):"""链表指定位置添加元素:param pos 从0开始"""# 若指定位置pos为第一个元素之前,则执行头部插入if pos<=0: #头插法self.add(item)# 若指定位置超过链表尾部,则执行尾部插入elif pos > (self.length()-1):#尾插法self.append(item)# 找到指定位置else:# pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置prev = self.__headcount = 0while count<(pos-1):count+=1prev = prev.next#当循环退出后,prev指向pos-1位置node = Node(item)# 先将新节点node的next指向插入位置的节点# prev.next存储的是下一个节点的地址,因为是在任意位置插入的,新节点node需要连接下一个节点,node.next指向了下一个节点node.next = prev.next# 将插入位置的前一个节点的next指向新节点prev.next = nodedef search(self,item):"""查找节点是否存在""""""链表查找节点是否存在,并返回True或者False"""if self.is_empty():return  Falsecur = self.__headwhile cur.next != self.__head:if cur.elem == item:return  Trueelse:cur = cur.next#退出循环,cur指向尾节点,需要比较一下最后一个元素是否等于item,等于返回trueif cur.elem == item:return Truereturn Falsedef remove(self,item):"""删除节点"""if self.is_empty():returncur = self.__headpre = Nonewhile cur.next != self.__head:# 找到了指定元素if cur.elem == item:#先判断此节点是否是头节点#头节点 # 如果第一个就是删除的节点if cur == self.__head:#头节点的情况#找尾节点rear = self.__headwhile rear.next != self.__head:rear = rear.next# 将头指针指向头节点的后一个节点self.__head = cur.nextrear.next = self.__headelse:#中间节点# 将删除位置前一个节点的next指向删除位置的后一个节点pre.next = cur.next#break  # 删除后再退出循环,需要一个总的break退出return #break只是循环退出,这里需要一个函数退出,就是returnelse:# 继续按链表后移节点pre = curcur = cur.next#退出循环,cur指向尾节点if cur.elem == item:if cur == self.__head:#这块还有问题,当有好几个节点,走到尾节点的时候#链表只有一个节点self.__head = Noneelse:# 将删除位置前一个节点的next指向删除位置的后一个节点#pre.next = cur.next #这句话跟下面一句话的意思一样pre.next = self.__headif __name__ == "__main__":# node = Node(100)ll = SingleCycleLinkList()print(ll.is_empty()) #Trueprint(ll.length())   #0ll.append(1)print(ll.is_empty()) #Falseprint(ll.length())   #1#ll.append(2)ll.add(8)ll.append(3)ll.append(4)ll.append(5)ll.append(6)#8 1 2 3 4 5 6ll.insert(-1,9)ll.travel()      #9 8 1 2 3 4 5 6ll.insert(3, 100)ll.travel()      #9 8 1 100 2 3 4 5 6ll.insert(10,200)ll.travel()      #9 8 1 100 2 3 4 5 6 200ll.remove(100)ll.travel()      #9 8 1 2 3 4 5 6 200ll.remove(9)ll.travel()      #8 1 2 3 4 5 6 200ll.remove(200)ll.travel()      #8 1 2 3 4 5 6

参考资料:网上的教程

python算法与数据结构-循环链表相关推荐

  1. python算法与数据结构-循环链表(41)

    阅读目录 一.循环链表的介绍 二.循环链表基本操作的python代码实现 三.循环链表基本操作的C语言实现 一.循环链表的介绍 上一篇我们已经讲过单链表,本篇给大家讲解循单链表的一个变形是单向循环链表 ...

  2. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  3. python算法与数据结构:08排序算法

    稳定性定义:相同的值在排序结束之后的相对次序不变. 1. 冒泡排序 每一轮相邻两个值之间比较,大小顺序相反的交换位置,最后的值总是最大. 稳定性:稳定 def BubbleSort(alist):&q ...

  4. python算法与数据结构-二叉树的代码实现(46)

    阅读目录 一.二叉树回忆 二.二叉树比链表好在哪里? 三.二叉树的节点定义(C语言版) 四.定义一个二叉树(C语言版) 五.初始化树(C语言版) 六.创建节点(C语言版) 七.插入节点(C语言版) 八 ...

  5. python算法与数据结构-数据结构中常用树的介绍(45)

    阅读目录 一.树的定义 二.二叉树介绍 三.完全二叉树介绍 四.满二叉树介绍 五.平衡二叉树(AVL树)介绍 六.红黑树介绍 七.霍夫曼树 八.B树介绍 九.B+树介绍 十.B*树介绍 十一.Trie ...

  6. python算法与数据结构-快速排序算法(36)

    阅读目录 一.快速排序的介绍 二.快速排序的原理 三.快速排序的步骤 四.快速排序的图解 五.快速排序的python代码实现 六.快速排序的C言语代码实现 七.快速排序的时间复杂度 八.快速排序的稳定 ...

  7. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  8. python算法与数据结构-插入排序算法(34)

    阅读目录 一.插入排序的介绍 二.插入排序的原理 三.插入排序的图解 四.插入排序的python代码实现 五.插入排序的C语言代码实现 六.插入排序的时间复杂度 七.插入排序的稳定性 一.插入排序的介 ...

  9. python算法与数据结构-选择排序算法(33)

    阅读目录 一.选择排序的介绍 二.选择排序的原理 三.选择排序的图解 四.选择排序总结 五.选择排序的python代码实现 六.选择排序的C语言代码实现 七.选择排序的时间复杂度 八.选择排序的稳定性 ...

最新文章

  1. Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序
  2. 5 可隐藏的侧栏_6种隐藏式设计,不仅实用,而且更显高级!
  3. 编译原理实验语义分析_Windows MVSC编译器实现Xtended Flow Guard(XFG)保护机制的原理分析...
  4. RabbitMQ发布确认原理
  5. 以太网供电技术/有源以太网技术POE简单介绍
  6. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包
  7. Python批量修改Excel文件格式:加粗、颜色交替、渐变背景色填充
  8. FAR,NEAR区别
  9. python文件读写到list_Python文件读写
  10. ASP.NET Trick文章系列--使用State Server管理Session状态的另类经济用法
  11. 无机金属专业里有计算机课吗,无机非金属材料工程专业课程有不少
  12. 友情链接php源代码_2017最新ThinkPHP开发的友情链接交易系统平台源码
  13. Python爬虫之headers和data的获取
  14. Idea+Mybatis源码构建
  15. ITIL事件管理流程设计
  16. webgis中等值面生成技术之-arcgis 用自带工具生成等值面并其发布成gp服务
  17. android室内地图,室内位置-与地图交互-开发指南-Android 室内地图SDK | 高德地图API...
  18. HashMap碰撞问题解析
  19. 【车道线检测论文阅读笔记——经典论文粗读汇总】
  20. 【利用Python进行数据分析——经验篇2】计算微博转发/评论/点赞h指数的Python代码

热门文章

  1. QML基础类型之palette
  2. C++多态案例一计算器类
  3. C++ 操作符优先级
  4. 04_pandas字符串函数;数据合并concat、merge;分组groupby;Reshaping;Pivot tables;时间处理(date_range、tz_localize等)
  5. 关于Maven中的常见命令,通过命令的方式快速创建一个空的maven工程,将jar包打到maven仓库中
  6. 07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
  7. Faster-RCNN训练自己数据集遇到的问题集锦
  8. OCP换题库了,052新加的考题及答案整理-第16题
  9. 好用的wordpress主题
  10. 关于Exchange邮箱服务器角色故障排查及解决思路分享