当前位置: 首页 > wzjs >正文

免费网站注册平台网站控制面板 地址

免费网站注册平台,网站控制面板 地址,安全教育平台作业登录入口,南通网站流量优化目录标题 循环链表的定义循环链表的初始化循环链表的创建循环链表的插入循环链表的删除 循环链表总代码与调试顺序表与链表的比较链式存储方式的比较 循环链表的定义 循环链表的结点定义与单链表一致,只包含数据域(data)和指针域&#xff08…

目录标题

    • 循环链表的定义
      • 循环链表的初始化
      • 循环链表的创建
      • 循环链表的插入
      • 循环链表的删除
    • 循环链表总代码与调试
    • 顺序表与链表的比较
    • 链式存储方式的比较

循环链表的定义

  • 循环链表的结点定义与单链表一致,只包含数据域(data)和指针域(next)。
  • 定义:循环链表作为一种首尾相接的链表,其尾结点的后继指针又指向链表的第一个结点,形成一个闭环。
  • 循环链表逻辑结构示意图

在这里插入图片描述

  • 代码定义循环链表结点
class Node:"""定义循环链表结点类型"""def __init__(self, data):# 存储结点中的数据域self.data = data# 指向后继结点的指针域nextself.next = None

循环链表的初始化

  • 初始化循环链表
class CLinkedList:"""循环链表的定义"""def __init__(self):"""循环链表的初始化"""# 声明头指针,将头结点的后继结点指向自己self.head = Node(None)self.head.next = self.head
  • 判断循环链表是否为空
    def isEmpty(self):"""判断是否为空:return: true or false"""return self.head.next is self.head
  • 求循环链表的长度
    def getLength(self):"""获取循环链表的长度:return: 当前循环链表中元素的个数"""# length用来计算循环链表的长度length = 0# 声明cur指针,用于遍历链表cur = self.head.next# 若cur没有指向自己,则表明未遍历完成while cur != self.head:length += 1cur = cur.nextreturn length
  • 打印循环链表
    def display(self):"""遍历循环链表,进行展示:return:"""if self.isEmpty():print("当前循环链表为空!")returnprint("循环链表的元素为:", end='')# 遍历循环链表cur = self.head.nextwhile cur != self.head:print(cur.data, end='')cur = cur.nextprint()

循环链表的创建

  • 使用尾插法实现循环链表的创建

  • 核心思想:

    • 查找到链表的尾结点
    • 将尾结点的后继结点指针指向新结点
    • 将新结点的后继指针指向头结点
  • 代码实现

    def append(self, data):"""建立循环链表:param data: 待插入的元素:return:"""# 查找尾结点rear = self.headwhile rear.next != self.head:rear = rear.next# 创建新结点newNode = Node(data)# 将尾结点的后继结点指针指向新结点rear.next = newNode# 将新结点的后继结点指针指向头结点newNode.next = self.head

循环链表的插入

  • 核心思想
    • 声明指针pre与递增变量i变量循环链表,找到需插入位置的前一结点;
    • 创建新结点,将元素值赋予结点;
    • 将新结点的后继指针指向指针pre的后继结点;
    • 将第index个结点的后继指针指向新结点
  • 插入示意图

在这里插入图片描述

  • 代码实现
    def insert(self, index, data):"""在循环链表中任一位置插入元素:param index: 待插入的位置:param data: 待插入的元素值:return:"""i = 1# 声明指针pre,用于遍历循环链表pre = self.head.next# 遍历停止的条件,pre为空,或指向下标为index-1的结点while pre != self.head and i != index-1:pre = pre.nexti += 1# index非法if pre == self.head or i > self.getLength():raise IndexError("index 非法")# 创建新结点newNode = Node(data)# 将新结点的后继指针指向指针pre的后继结点newNode.next = pre.next# 将第index个结点的后继指针指向新结点pre.next = newNode

循环链表的删除

  • 核心思想

    • 声明指针pre与递增变量i变量循环链表,找到需删除位置的前一结点;
    • 保留被删元素的值,再对结点进行删除;
    • 将pre的后继结点指向pre指针后继结点的后继结点;
    • 实现被删结点的断连。
  • 删除示意图
    在这里插入图片描述

  • 代码实现

    def delete(self, index):"""在循环链表中任一位置删除元素:param index: 删除下标index的元素:return: 被删的元素值"""if self.isEmpty():raise IndexError("当前循环链表为空!")i = 1# 声明指针pre,用来遍历循环链表pre = self.head.next# 遍历停止的条件,pre为空,或指向下标为index-1的结点while pre != self.head and i != index - 1:pre = pre.nexti += 1# index非法if pre == self.head or i > self.getLength():raise IndexError("index 非法")# 获取被删元素的值data = pre.next.data# 将要删结点从循环链表中断开pre.next = pre.next.nextreturn data

循环链表总代码与调试

# 6.循环链表的实现
class Node:"""定义循环链表结点类型"""def __init__(self, data):# 存储结点中的数据域self.data = data# 指向后继结点的指针域nextself.next = Noneclass CLinkedList:"""循环链表的定义"""def __init__(self):"""循环链表的初始化"""# 声明头指针,将头结点的后继结点指向自己self.head = Node(None)self.head.next = self.headdef isEmpty(self):"""判断是否为空:return: true or false"""return self.head.next is self.headdef getLength(self):"""获取循环链表的长度:return: 当前循环链表中元素的个数"""# length用来计算循环链表的长度length = 0# 声明cur指针,用于遍历链表cur = self.head.next# 若cur没有指向自己,则表明未遍历完成while cur != self.head:length += 1cur = cur.nextreturn lengthdef display(self):"""遍历循环链表,进行展示:return:"""if self.isEmpty():print("当前循环链表为空!")returnprint("循环链表的元素为:", end='')# 遍历循环链表cur = self.head.nextwhile cur != self.head:print(cur.data, end='')cur = cur.nextprint()def append(self, data):"""建立循环链表:param data: 待插入的元素:return:"""# 查找尾结点rear = self.headwhile rear.next != self.head:rear = rear.next# 创建新结点newNode = Node(data)# 将尾结点的后继结点指针指向新结点rear.next = newNode# 将新结点的后继结点指针指向头结点newNode.next = self.headdef insert(self, index, data):"""在循环链表中任一位置插入元素:param index: 待插入的位置:param data: 待插入的元素值:return:"""i = 1# 声明指针pre,用于遍历循环链表pre = self.head.next# 遍历停止的条件,pre为空,或指向下标为index-1的结点while pre != self.head and i != index-1:pre = pre.nexti += 1# index非法if pre == self.head or i > self.getLength():raise IndexError("index 非法")# 创建新结点newNode = Node(data)# 将新结点的后继指针指向指针pre的后继结点newNode.next = pre.next# 将第index个结点的后继指针指向新结点pre.next = newNodedef delete(self, index):"""在循环链表中任一位置删除元素:param index: 删除下标index的元素:return: 被删的元素值"""if self.isEmpty():raise IndexError("当前循环链表为空!")i = 1# 声明指针pre,用来遍历循环链表pre = self.head.next# 遍历停止的条件,pre为空,或指向下标为index-1的结点while pre != self.head and i != index - 1:pre = pre.nexti += 1# index非法if pre == self.head or i > self.getLength():raise IndexError("index 非法")# 获取被删元素的值data = pre.next.data# 将要删结点从循环链表中断开pre.next = pre.next.nextreturn dataif __name__ == '__main__':print('PyCharm')# 循环链表调试# 1.初始化list = CLinkedList()list.display()# 2. 创建循环链表,尾插法for i in range(10):list.append(chr(ord('A') + i))print('尾插法结果:', end='')list.display()# 3.获取循环链表长度length = list.getLength()print('循环链表长度', length)# 4.在表中插入元素list.insert(2, 'Y')list.display()# 5.在表中删除元素data = list.delete(3)print('被删除元素值为:', data)list.display()

顺序表与链表的比较

  • 空间上:顺序表存储空间静态分配;动态链表的存储空间为动态分配。
  • 时间上:顺序表随机存取,链式表需从头指针开始取得。
  • 插入删除上:顺序表平均需移动近一半元素;链式表只需修改指针。
  • 操作上:顺序表的存储等操作较为简单,而链式表中指针的操作较为复杂,难操作。

链式存储方式的比较

在这里插入图片描述

  • 带头结点的循环链表
    在这里插入图片描述
  • 带尾结点的循环链表
    在这里插入图片描述
http://www.dtcms.com/wzjs/811255.html

相关文章:

  • 网站建设同步视频网站排名优化培训
  • 提供提供手机网站建设微信分享的h5网站开发
  • 域名租赁网站手机网站 搜索优化 百度
  • 网站开发主要内容如何在云服务器上开多几个网站
  • 做内贸现在一般都通过哪些网站怎样查找企业联系方式
  • 稻壳网站建设wordpress 添加缩略图
  • wordpress如何设置支付汕头seo优化
  • 网站空间不足自己写代码做网站要什么技术
  • 徐州网站关键词推广郑州宣传片制作多少钱
  • 建设企业网站包含什么宁波专业建网站外包
  • 大网站都开放自己的cms系统直播网站怎么建设
  • 哪些网站是用php做的icp备案官网查询
  • 江苏徐州网站建设湖南长沙大学
  • 建设淘宝网站的市场分析动漫制作专业学校
  • 大型门户网站都有上海小程序开发公司哪家好?
  • 经营网站备案信息科技自主自强国家发展战略
  • 个人网站备案怎么写广州十大软件公司排名
  • 如果搭建网站佛山公司网站设计团队
  • asp 茶叶网站模板网站用户体验模型
  • 关于网站开发网页上传和网站发布开发游戏需要多少资金
  • 做网站程序的步骤成都网络推广网站
  • 关键词网站查询wordpress 分类目录seo插件
  • 哈尔滨建站流程施工企业资料
  • 购物网站建设模板网页版传奇复古
  • 广州外贸网站建设公司自己建网站收费吗
  • wordpress做电商网站wordpress page post
  • 邯郸市网站建设多少钱接单网站做火牛
  • 网站开发项目经验描述seo海外推广
  • 设计师分享网站wordpress 写模版
  • 建设公司网站报价宁波网站建设开发