循环链表与双向循环链表

循环链表

循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环

双向循环链表

双向链表相较于之前的链表多了上一节点连接域,在双向链表中,游标的移动方向可以不只是单一的向后移动,还增加了向前移动的功能。

Python创建循环链表与双向循环链表

计划实现以下功能

  • is_empty() 链表是否为空
  • length() 链表长度
  • add(elem) 链表头部添加元素
  • append(elem) 链表尾部添加元素
  • travel() 遍历整个链表
  • position(pos)根据位置读取指定元素
  • element(elem)输出元素所在位置
  • search(elem) 查找节点是否存在
  • insert(pos, elem) 指定位置添加元素
  • del_add(self) 删除首结点
  • del_app(self) 删除尾结点
  • remove(elem) 指定元素删除节点
  • delete(pos)根据位置删除
  • clear()清空链表

Python制作

python实现循环链表

class Node:def __init__(self, elem):self.elem = elemself.next = Noneclass LoopLinked:def __init__(self, node=None):self.__head = nodeif node:node.next = self.__headdef is_empty(self):"""判断链表是否为空"""# 判断头结点的值是否为空return self.__head is Nonedef length(self):"""判断链表长度"""# 初始化游标cur = self.__head# 判断是否为空if self.__head is None:return# 长度计算变量count = 1# 判断游标指向是否为空while cur.next is not self.__head:# 指向下一个结点,同时计数器加一cur = cur.nextcount += 1return countdef add(self, elem):"""头部添加元素"""# 创建新结点newNode = Node(elem)# 判断是否为空链表if self.is_empty():self.__head = newNodenewNode.next = self.__headelse:# 创建游标cur = self.__head# 将原头结点坐标给新结点,同时将新结点坐标给头结点,再将尾结点指向新结点while cur.next != self.__head:cur = cur.nextnewNode.next, self.__head = self.__head, newNodecur.next = newNodedef append(self, elem):"""尾部添加元素"""# 新建结点newNode = Node(elem)# 判断是否为空链表if self.is_empty():# 如果是空链表就将头游标指向新结点self.__head = newNodenewNode.next = self.__headelse:# 初始化游标cur = self.__head# 将游标移动到末尾while cur.next is not self.__head:cur = cur.next# 将尾结点指向新结点,同时将新结点执行头结点cur.next, newNode.next = newNode, self.__headdef travel(self):"""遍历整个链表"""# 初始化游标cur = self.__head# 输出每个结点的elemwhile cur.next is not self.__head:print(cur.elem, end=' ')cur = cur.nextprint(cur.elem)def insert(self, pos, elem):"""指定位置添加元素"""# 判断插入位置if pos <= 0:self.add(elem)elif pos > (self.length() - 1):self.append(elem)else:# 新建结点newNode = Node(elem)# 创建游标cur = self.__head# 创建计数器count = 0# 将游标定位到指定位置前一位结点上while count < (pos - 1):count += 1cur = cur.next# 将游标位置的的next给新结点,将新结点的位置给游标newNode.next, cur.next = cur.next, newNodedef position(self, pos):"""根据位置读取元素"""# 判断输入位置是否在链表中if 0 <= pos <= (self.length() - 1):# 创建游标cur = self.__head# 创建计数器count = 0# 将游标移动到指定位置while count < pos:count += 1cur = cur.nextreturn cur.elemelse:return Falsedef element(self, elem):"""输出元素所在位置"""# 创建游标和计数器cur = self.__headcount = 0while True:# 判断游标指向元素是否为输入元素if cur.elem == elem:return count# 判断测试的长度是否已经超出elif cur.next is self.__head:return Falsecur = cur.nextcount += 1def del_add(self):"""删除首结点"""# 创建游标cur = self.__head# 将尾结点重新指向新的头结点while cur.next != self.__head:cur = cur.next# 将首节点后移self.__head = self.__head.next# 让尾结点指向新的首节点cur.next = self.__headdef del_app(self):"""删除尾结点"""# 创建游标cur = self.__headpre = Nonewhile cur.next != self.__head:pre, cur = cur, cur.nextpre.next = self.__headdef remove(self, elem):"""根据指定元素删除"""cur = self.__headpre = Nonewhile cur:# 判断游标指向元素是否为输入元素if cur.elem == elem:# 判断是否删除的为首节点if pre is None:self.del_add()return# 判断是否删除的为尾结点if cur.next is self.__head:self.del_app()returnelse:pre.next = cur.nextbreakelif cur.next == self.__head:return# 游标后移else:pre, cur = cur, cur.nextdef delete(self, pos):"""根据位置删除"""# 创建游标以及副游标cur = self.__headpre = None# 判断输入是否在链表中if 0 <= pos <= (self.length() - 1):# 判断是否为首结点if pos == 0:self.del_add()return# 判断是否为尾结点elif pos == self.length():self.del_app()returnelse:count = 0while count < pos:count += 1pre, cur = cur, cur.nextpre.next = cur.nextdef clear(self):"""清空链表"""self.__head = None

双向循环链表

结点

class DoubleNode:def __init__(self, elem):self.elem = elemself.next = Noneself.prev = None

我们将双向循环链表和循环链表对比,如有相同的就不在重复编写。
双向结点和单向结点主要在添加和删除结点的时候有所不同。

添加元素

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Linked:def __init__(self, node=None):self.__head = nodeif node:node.next = nodenode.prev = nodedef add(self, elem):"""头部添加元素"""# 创建新结点newNode = DoubleNode(elem)# 判断是否为空链表if self.is_empty():self.__head = newNodenewNode.prev, newNode.next = self.__head, self.__headelse:# 将新结点指向原头结点newNode.next = self.__head# 将尾结点指向新结点self.__head.prev.next = newNode# 将新结点指向尾结点newNode.prev = self.__head.prev# 将原头结点指向新结点self.__head.prev = newNode# 将原头结点定义为新结点self.__head = newNodedef append(self, elem):"""尾部添加元素"""# 新建结点newNode = DoubleNode(elem)# 判断是否为空链表if self.is_empty():self.__head = newNodenewNode.prev, newNode.next = self.__head, self.__headelse:# 将原尾结点指向新结点self.__head.prev.next = newNode# 将新结点指向原尾结点newNode.prev = self.__head.prev# 将尾结点指向头结点newNode.next = self.__head# 将头结点指向尾结点self.__head.prev = newNodedef insert(self, pos, elem):"""指定位置添加元素"""# 判断插入位置if pos <= 0:self.add(elem)elif pos > (self.length() - 1):self.append(elem)else:# 新建结点newNode = DoubleNode(elem)# 创建游标以及副游标cur = self.__head# 创建计数器count = 0# 将游标定位到指定位置前一位结点上while count < (pos - 1):count += 1cur = cur.next# 将新结点指向游标以及游标之后的结点newNode.prev, newNode.next = cur, cur.next# 将游标所在结点之后的结点指向新结点cur.next.prev = newNode# 将指针所在结点指向新结点cur.next = newNode

删除元素

def del_add(self):"""删除首结点"""# 创建指向尾结点的游标cur = self.__head.prev# 将头结点后移一位self.__head = self.__head.next# 将尾结点指向新的头结点cur.next = self.__head# 将新的头结点执行尾结点self.__head.prev = self.__headdef del_app(self):"""删除尾结点"""# 创建游标并且指向尾结点cur = self.__head.prev# 将游标前移一位cur = cur.prev# 将游标所在结点指向头结点cur.next = self.__head# 将头结点指向游标所在位置self.__head.prev = curdef remove(self, elem):"""根据指定元素删除"""cur = self.__headwhile cur:# 判断游标指向元素是否为输入元素if cur.elem == elem:# 判断是否删除的为首节点if self.__head.elem == elem:self.del_add()return# 判断是否删除的为尾结点if cur.next is self.__head:self.del_app()returnelse:cur.next.prev = cur.prevcur.prev.next = cur.nextbreakelif cur.next == self.__head:return# 游标后移else:cur = cur.nextdef delete(self, pos):"""根据位置删除"""# 判断输入是否在链表中if 0 <= pos <= (self.length() - 1):# 判断是否为首结点if pos == 0:self.del_add()return# 判断是否为尾结点elif pos == self.length():self.del_app()returnelse:# 创建游标以及计数器cur = self.__headcount = 0while count < pos:count += 1cur = cur.nextcur.next.prev = cur.prevcur.prev.next = cur.next

Python创建一个循环链表、双向循环链表相关推荐

  1. 【LINUX】——linux如何使用Python创建一个web服务

    问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...

  2. python词云改颜色_使用Python创建一个与图像颜色匹配的词云

    原标题:使用Python创建一个与图像颜色匹配的词云 来自:https://www.linuxmi.com/ 我用Python造了一个词云.不过这次创建的是与图像颜色匹配的词云. 使用Python w ...

  3. python创建一个空的dataframe_python 创建一个空dataframe 然后添加行数据的实例

    实例如下所示: import pandas as pd import re import math dframe1 = pd.read_excel("window regulator分析报告 ...

  4. Python 创建一个二维列表

    Python 创建一个二维列表 空二维列表 lis=[[] for i in range(5)]for i in range(5):lis.append([]) 普通二维列表 lis=[[i for ...

  5. 用python创建一个新文件_Python创建文件和追加文件内容实例

    一.用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行: 代码如下: #python >>>f=open('f.txt','w') # r只读,w可写,a追加 &g ...

  6. python创建一个文件并写入_python创建文件并写入

    python怎么以追加的方式写文件? Python 3.5 想将从1到10写入一个文件并且自动换行 现在需要一个写文件方法,将selenium的脚本运行结果写入test_result.log文件中 首 ...

  7. python建立一个简单的server_使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  8. python创建一个列表_Python创建一个元素都为0的列表实例

    Python创建一个元素都为0的列表实例 实现创建一个元素都为0的列表: l=10 lis=[0]*l lis 输出结果: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 以上这篇Pyt ...

  9. 用python创建一个最简单的触发器trigger

    用python创建一个最简单的触发器trigger 上面就是自己的创建效果了,点击之后会有对话框弹出来,这就是最简单的触发器原理了. trigger就是触发器,触发器主要是通过事件进行触发而被执行的工 ...

最新文章

  1. 设计模式之装饰模式(Java实现)
  2. mysql thread safe_Windows环境下完全手工配置Apache、MySQL和PHP(Thread Safe)
  3. 习题1.8 二分查找 (20 分)
  4. Objective-C笔记
  5. spring入门案例plus
  6. ctf-HITCON-2016-houseoforange学习
  7. spring框架入门day02
  8. Mysql_多表查询练习
  9. MATLAB深度学习 2019
  10. js 直接打开选择文件窗口_打开CAD文件时,怎么快速选择“gbcbig.shx”字体?
  11. 台式计算机如何安装摄像头,台式机怎样安装摄像头
  12. 【AOP】面向切面谈恋爱(二)| 学废了AOP,他最终失去了爱情
  13. 使用React.js和appbase.io构建类似Twitter的Search Feed
  14. Hadoop是什么?基本概念
  15. python段落注释的语法格式是_python段落注释
  16. Word 2016中给公式自动编号
  17. 手机上流行的各类谜语及谜底
  18. CVPR 2018 | 8篇论文、10+Demo、双项挑战赛冠军,旷视科技掀起CVPR产学研交流热潮
  19. LAMMPS模拟——纳米螺旋桨
  20. android 备份qcn文件,关于efs文件的qcn备份

热门文章

  1. Linux命令(7):less命令
  2. crm---本项目的权限控制模式
  3. HotSpot 自动内存管理笔记与实战
  4. MySQL Windows ZIP 免费安装和启动设置
  5. 2.3.2便捷的电子邮件
  6. ComponentArt TreeView for ASP.NET - Core Features
  7. 【PP】重复制造业务中工作中心变更的问题
  8. ABAP 如何判断调用smartforms时是进行打印还是预览
  9. SAP采购订单税码增强检查
  10. 如何用C语言清空特定文件夹中的所有文件