单向循环列表如图所示

单向循环链表的实现

一、往链表头部添加一个节点值为4
1、新增一个节点node=Node(4)

新建一个节点

    node=Node(data)if self.is_empty():#即是头节点也是尾节点self.head=node#node.next=self.headelse:# 先让node指向当前链表中的头节点node.next=self.head# 再让链表的尾节点的next指向nodecur=self.headwhile cur.next!=self.head:cur=cur.nextcur.next=node#再让链表的head指向当前node节点self.head=node#添加节点之后,链表的长度加1self._length+=1


二、往链表尾部添加一个节点

新建一个节点node,值为data

    node=Node(data)# 找到链表的尾节点# 思路:从头节点开始遍历链表中的所有节点]# 每次判断当前节点的next是否为空# 为空这说明当前节点就是尾节点# 不为空,通过当前节点的next方法去访问下一个节点,if self.head:cur = self.headwhile cur.next != self.head:cur = cur.nextcur.next = node        #原本的尾节点指向新建的节点else:self.head=nodenode.next=self.head     #新的尾节点指向当前的头节点# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length+=1


三、往链表中插入一个节点

    if pos<=0:self.add(data)elif pos>self._length:self.append(data)else:# 1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur=self.headwhile pos-1:cur=cur.nextpos-=1#到这里之后,cur指向的是索引为pos-1的节点# node.next=prev_node.next# 3让node的next指向索引为pos的节点node.next=cur.next# 4让索引为pos-1的节点的next指向nodecur.next=node# 5链表的长度加1self._length+=1


四、删除链表中第一个值为data的节点
1、删除的值为头部节点

2、删除的值为非头节点

a、先要判断链表是否为空,为空那必然没有值为data的节点

#判断链表是否为空,为空那必然没有值为data的节点cur=self.headflag=True       # 标志位的作用:让第一次循环能进入prev=Nonewhile cur!=self.head or flag:if cur.data==data:flag=False      #让循环继续的条件就是cur!=self.head#如果前驱节点为空,说明我们要删除的节点是第一个节点if not prev:#找到尾节点last_node=self.headwhile last_node.next!=self.head:last_node=last_node.next#让尾节点的next指向头节点last_node.next=self.head.nextself.head=cur.next          #self.head.nextelse:prev.next = cur.nextself._length-=1return 0prev=curcur = cur.nextreturn -1

五、修改链表中指定位置节点的值

    # 修改链表中指定位置节点的值if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('输入的范围不符合要求')

六、查找链表中是否有节点的值为data

    if self.is_empty():return Falsecur = self.headflag=Truewhile cur!=self.head or flag:flag=Falseif cur.data == data:return Truecur = cur.nextreturn False

代码块:

class Node:def __init__(self, data, _next=None):self.data = data  # 数据域self.next = _next  # 指针域class SingleCycleLinkList:def __init__(self):self.head = None  # 链表的的头节点self._length = 0  # 链表的长度,链表的元素个数#self.tail=None    # 链表的尾节点def is_empty(self):# 判断链表的是否为空return self._length==0def length(self):# 返回链表的长度return self._lengthdef nodes_list(self):# 返回链表中的所有节点的值组成的列表res=[]#判断链表是否为空if self.is_empty():return reselse:res.append(self.head.data)cur=self.head.nextwhile cur!=self.head:res.append(cur.data)cur=cur.nextreturn resdef add(self, data):# 往链表的头部添加一个节点,值为data# 新建一个节点node=Node(data)if self.is_empty():self.head=nodenode.next=self.headelse:# 先让node指向当前链表中的头节点node.next=self.head# 再让链表的尾节点的next指向nodecur=self.headwhile cur.next!=self.head:cur=cur.nextcur.next=node#再让链表的head指向当前node节点self.head=node#添加节点之后,链表的长度加1self._length+=1def append(self, data):# 往链表的尾部添加一个节点,值为data# 新建一个节点node,值为datanode=Node(data)# 找到链表的尾节点# 思路:从头节点开始遍历链表中的所有节点# 每次判断当前节点的next是否为空# 为空这说明当前节点就是尾节点# 不为空,通过当前节点的next方法去访问下一个节点,if self.head:cur = self.headwhile cur.next != self.head:cur = cur.nextcur.next = node        #原本的尾节点指向新建的节点else:self.head=nodenode.next=self.head     #新的尾节点指向当前的头节点# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length+=1def insert(self, pos, data):# 往链表的指定位置插入一个节点,值为dataif pos<=0:self.add(data)elif pos>self._length:self.append(data)else:# 1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur=self.headwhile pos-1:cur=cur.nextpos-=1#到这里之后,cur指向的是索引为pos-1的节点# node.next=prev_node.next# 3让node的next指向索引为pos的节点node.next=cur.next# 4让索引为pos-1的节点的next指向nodecur.next=node# 5链表的长度加1self._length+=1def remove(self, data):# 删除链表中第一个值为data的节点# 判断链表是否为空,为空那必然没有值为data的节点cur=self.headflag=True       # 标志位的作用:让第一次循环能进入prev=Nonewhile cur!=self.head or flag:if cur.data==data:flag=False      #让循环继续的条件就是cur!=self.head#如果前驱节点为空,说明我们要删除的节点是第一个节点if not prev:#找到尾节点last_node=self.headwhile last_node.next!=self.head:last_node=last_node.next#让尾节点的next指向头节点last_node.next=self.head.nextself.head=cur.next          #self.head.nextelse:prev.next = cur.nextself._length-=1return 0prev=curcur = cur.nextreturn -1def modify(self, pos,data):# 修改链表中指定位置节点的值if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('输入的范围不符合要求')def search(self, data):# 查找链表中是否有节点的值为dataif self.is_empty():return Falsecur = self.headflag=Truewhile cur!=self.head or flag:flag=Falseif cur.data == data:return Truecur = cur.nextreturn Falseif __name__ == '__main__':l1=SingleCycleLinkList()    #新建一个链表类# print(l1.head,l1.length())# l1.add(1)# print(l1.head.data, l1.length())# print(l1.nodes_list())# l1.add(5)# print(l1.head.data, l1.length())# print(l1.nodes_list())## print(l1.head.data,l1.head.next.data,l1.head.next.next.data)   #验证是循环的# l1.append(2)# print(l1.head.data, l1.length())# print(l1.nodes_list())# print(l1.head.data, l1.head.next.data, l1.head.next.next.data,l1.head.next.next.next.data)  # 验证是循环的# l1.insert(1,7)# print(l1.nodes_list())# l1.insert(-1, 6)# print(l1.nodes_list())# print(l1.is_empty())# l1.remove(7)# print(l1.nodes_list())# l1.modify(2,8)# print(l1.nodes_list())# print(l1.search(8))l1.add(1)l1.add(2)l1.add(3)l1.add(4)l1.add(5)print(l1.nodes_list())l1.remove(5)print(l1.nodes_list())l1.modify(1,7)print(l1.nodes_list())print(l1.search(8))

算法—详细讲解单向循环链表的实现(python)相关推荐

  1. 算法—详细讲解单向链表的实现(python)

    链表 链表是一种物理存储单元上非连续.非顺序的存储结构 数据元素的逻辑顺序通过链表中的指针链接次序实现 链表由一系列节点组成,节点可以在运行时动态生成 每个节点包含两个部分:存储数据元素的数据区.存储 ...

  2. 算法—详细讲解双向链表的实现(python)

    双向链表 双向链表的实现 一.往链表的头部增加一个节点 # 新建一个节点node = Node(data)# 判断链表是否为空if self.is_empty():self.head = nodeel ...

  3. 模拟退火算法详细讲解(含实例python代码)

    模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...

  4. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  5. lamport面包店算法详细讲解及代码实现

    lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...

  6. Adaboost算法详细讲解

    转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...

  7. 【数据结构与算法】之单向循环链表的创建/遍历/插⼊/查找/删除算法实现

    一.单向循环链表简介 单向循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表. 带头结点的循环单链表的各种操作的算法实现与带头结 ...

  8. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  9. 从无到有算法养成篇-单向循环链表的常规操作

    1.单向循环链表的创建 创建 tips: 由于存在两种情况: ① 第一次开始创建; ②已经创建,往里面新增数据 所以需要判断是否第一次创建链表 YES->创建一个新结点,并使得新结点的next ...

最新文章

  1. PCL学习笔记,区域生长分割(region growing segmentation)
  2. loader调用过程
  3. c语言汉字属于什么类型_你知道你的身体属于什么类型么?
  4. 使用s3sec批量化自动扫描S3存储桶泄露数据
  5. oracle乱码函数,jfinal oracle操作时decode函数填值乱码 求助什么原因????
  6. 移动端1px像素实现技巧 - 讲解篇
  7. 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中
  8. oracle关于分区,关于Oracle分区
  9. java plus方法_Java MyBatis-Plus 基本使用
  10. 网易云课堂-吴恩达机器学习-学习归纳-1-初识机器学习
  11. 超级详细的Junit单元测试教程
  12. Altium Designer如何用AGND、DGND组织不同器件的引脚,同时处理好不同网络之间的直接连通
  13. Visio Viewer 打开vsd文件
  14. NLP系列(8)_用可视化解构BERT,从上亿参数中提取出的6种直观模式
  15. 视觉-相机图像质量测试
  16. Java实现DES加密解密(对称式)
  17. 交换机入门小知识2(MAC地址、交换机如何处理数据帧)
  18. Columns函数:返回数据表区域的总列数。
  19. armbian系统实现服务器重启后自动运行指令及解决rc.local和rc-local.service出现的错误
  20. 用jmeter压测tcp

热门文章

  1. python 标准错误输出_过程的实时标准输出/错误捕获
  2. 恢复mysql数据库详细图解_binlog恢复mysql数据库超详细步骤
  3. UPS不间断电源培训资料
  4. 数据中心架构有哪些组件?
  5. 成功解决RuntimeError: Java is not installed, or the Java executable is not on system path
  6. 成功解决TypeError int object is not iterable
  7. DL之DNN优化技术:神经网络算法简介之数据训练优化【mini-batch技术+etc】
  8. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(LabelFrame/Checkbutton/Radiobutton)
  9. 蓝桥杯_算法训练_关联矩阵
  10. Python基础--1.1Python基础介绍