一步一步写算法(之循环单向链表)

单向链表改双向链表 单向链表改双向链表 -数据结构题目 (原题来自严蔚敏老师教材习题册2.32) 题目:已知有一个单向循环链表,其每个结点中含三个域:prior,data和next,其中data为数据域,next为指向后继结点的指针域,prior也为指针域,但它的值为空(NULL),试编写算法将此单向循环链表改为双向循环链表,即使prior成为指向前驱结点的指针域。 算法思想:先建立一个单链表,然后写一个函数,将prior指针指向它的前驱元素即可完成修改。 c++代码如下: #include <iostream> 阅读详情

前面的博客中,我们曾经有一篇专门讲到单向链表的内容。那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面。有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势。

    那么在实现过程中,循环单向链表有什么不同?

    1)打印链表数据

[cpp]  view plain copy
  1. void print_data(const LINK_NODE* pLinkNode)  
  2. {  
  3.     LINK_NODE* pIndex = NULL;  
  4.     if(NULL == pLinkNode)  
  5.         return;  
  6.   
  7.     printf("%d\n", pLinkNode->data);  
  8.     pIndex = pLinkNode->next;  
  9.     while(pLinkNode != pIndex){  
  10.         printf("%d\n", pIndex->data);  
  11.         pIndex = pIndex ->next;  
  12.     }  
  13. }  
    以往,我们发现打印数据的结束都是判断指针是否为NULL,这里因为是循环链表所以发生了变化。原来的条件(NULL != pLinkNode)也修改成了这里的(pLinkNode != pIndex)。同样需要修改的函数还有find函数、count统计函数。


    2)插入数据

[cpp]  view plain copy
  1. STATUS insert_data(LINK_NODE** ppLinkNode, int data)  
  2. {  
  3.     LINK_NODE* pNode;  
  4.     if(NULL == ppLinkNode)  
  5.         return FALSE;  
  6.   
  7.     if(NULL == *ppLinkNode){  
  8.         pNode = create_link_node(data);  
  9.         assert(NULL != pNode);  
  10.   
  11.         pNode->next = pNode;  
  12.         *ppLinkNode = pNode;  
  13.         return TRUE;  
  14.     }  
  15.   
  16.     if(NULL != find_data(*ppLinkNode, data))  
  17.         return FALSE;  
  18.   
  19.     pNode = create_link_node(data);  
  20.     assert(NULL != pNode);  
  21.   
  22.     pNode->next = (*ppLinkNode)->next;  
  23.     (*ppLinkNode)->next = pNode;  
  24.     return TRUE;  
  25. }  
这里的insert函数在两个地方发生了变化:

    a)如果原来链表中没有节点,那么链表节点需要自己指向自己

    b)如果链表节点原来存在,那么只需要在当前的链表节点后面添加一个数据,同时修改两个方向的指针即可


    3) 删除数据

[cpp]  view plain copy
  1. STATUS delete_data(LINK_NODE** ppLinkNode, int data)  
  2. {  
  3.     LINK_NODE* pIndex = NULL;  
  4.     LINK_NODE* prev = NULL;  
  5.     if(NULL == ppLinkNode || NULL == *ppLinkNode)  
  6.         return FALSE;  
  7.   
  8.     pIndex = find_data(*ppLinkNode, data);  
  9.     if(NULL == pIndex)  
  10.         return FALSE;  
  11.   
  12.     if(pIndex == *ppLinkNode){  
  13.         if(pIndex == pIndex->next){  
  14.             *ppLinkNode = NULL;  
  15.         }else{  
  16.             prev = pIndex->next;  
  17.             while(pIndex != prev->next)  
  18.                 prev = prev->next;  
  19.   
  20.             prev->next = pIndex->next;  
  21.             *ppLinkNode = pIndex->next;  
  22.         }  
  23.     }else{  
  24.         prev = pIndex->next;  
  25.         while(pIndex != prev->next)  
  26.             prev = prev->next;  
  27.         prev->next = pIndex->next;  
  28.     }  
  29.   
  30.     free(pIndex);  
  31.     return TRUE;  
  32. }  
和添加数据一样,删除数据也要在两个方面做出改变:

    a)如果当前链表节点中只剩下一个数据的时候,删除后需要设置为NULL

    b)删除数据的时候首先需要当前数据的前一个数据,这个时候就可以从当前删除的数据开始进行遍历

    c) 删除的时候需要重点判断删除的数据是不是链表的头结点数据


单向链表、单向循环链表、双向链表(Python) 1.单向链表 2.单向循环链表 3.双向链表 4.链表与顺序表的对比 5.自定义单向链表 6.自定义单向循环链表 7.自定义双向链表 阅读详情

相关推荐

单向循环链表Python

单向循环链表(Singly Circular Linked List)是一种常见的链表数据结构。与普通链表不同的是,单向循环链表中,最后一个节点的指针不是指向空值(null),而是指向第一个节点,形成一个闭环。 单向循环链表由一系列节点组成,每个节点包含两部分:数据域和指针域。数据域用于存储具体的数据,而指针域则指向下一个节点。最后一个节点的指针域指向第一个节点,形成了循环。

泰敢人辣的博客 3094

数据结构系列学习(四) - 单向循环链表(Circular Linked List)

数据结构学习目录:数据结构系列学习(一) - An Introduction to Data Structure数据结构系列学习(二) - 顺序表(Contiguous_List) 数据结构系列学习(三) - 单链表(Linked_List)在上一篇文章中我们学习并使用C语言对不带头节点的单链表进行了实现,在这篇文章中我们将对另一种的链式存储结构——循环链表中的单向循环链表进行学习并使用代码实现。作为链式存储的另一种存储结构——循环链表,我们首先应该明确的是,单向循环链表和普通的单链表有什么区别?我们用两张

曾铎的博客 4067

UE5热更新(通过Pak包加载关卡资源,并添加到流关卡)

请先阅读我上一篇文章)**

xialuhui的博客 6456

【数据结构-C语言】单向链表,循环单向链表

顺序表:顺序存储的线性表 链式表:链式存储的线性表,简称链表 由于顺序表的缺点(数据连续存储),顺序存储的数据因为挤在一起而导致需要成片移动,那很容易想到的解决方案是将数据离散地存储在不同内存块中,然后再用指针将他们串起来,这种朴素的思路所形成的链式线性表,就是所谓的链表。顺序表和链表存在的基本样态如下图所示

sakura0908的博客 2999

【项目管理】第8章 项目整合管理 --知识点整理

制定项目章程: 第一步,旨在明确项目的目标、范围、关键里程碑等关键信息,为项目的后续工作奠定基础。制订项目管理计划: 在项目章程的基础上,进一步详细规划项目的执行过程,包括时间、成本、质量、风险等方面的管理计划。指导与管理项目执行: 按照项目管理计划执行项目,同时监控项目的进展,确保项目按照计划进行。监控项目工作: 对项目的执行情况进行持续监控,及时发现并解决问题,确保项目目标的实现。

weixin_42081167的博客 1593

STM32超声波避障小车硬件设计与实时测距实现

超声波测距是嵌入式系统中经典的环境感知技术,其原理基于声波在空气中的传播时间与距离的线性关系,通过精确计时实现非接触式距离测量。该技术具备成本低、抗光干扰强、算法简洁等优势,广泛应用于智能小车、机器人避障、液位监测等场景。工程落地的关键在于硬件信号完整性(如5V/3.3V电平匹配)、微秒级定时精度(依赖高稳定外部晶振与输入捕获模式)以及强干扰环境下的数据鲁棒性(需软硬协同滤波)。本文以STM32F103C8T6为平台,深入解析HC-SR04模块的时序闭环控制、TIM3输入捕获双沿测量、L298N电机状态机驱

weixin_42578963的博客 295

数据结构之单向循环链表

单向循环链表与单向链表的结点结构相同,每个结点都有一个数据域、一个指针域。数据域用来存储结点的数据,指针域用来存储下一个结点所在的内存空间地址。两者不同的是,单向链表末结点的指针域为NULL,而单向循环链表末结点的指针域存储了头结点所在的内存空间地址。这里实现了单向循环链表的六个基本功能,初始化链表、添加结点(头插法、尾插法)、删除结点、反转链表、遍历链表。

yjhqukq的博客 2669

从UART到RS485:手把手教你用SIT3485E收发器搞定工业级通信(含原理图与PCB布局要点)

本文详细解析了从UART到RS485的工业级通信转换,重点介绍了SIT3485E收发器的原理图设计、PCB布局要点及抗干扰技巧。通过差分信号传输和优化电路设计,实现长距离、多设备稳定通信,适用于工业自动化等复杂环境。

weixin_29169505的博客 348

一步一步写算法(之循环单向链表) (转)

前面的博客中,我们曾经有一篇专门讲到单向链表的内容。那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面。有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势。 那么在实现过程中,循环单向链表有什么不同? 1)打印链表数据 voidprint_data(const...

weixin_30352191的博客 91

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

Arduino读取串口接收到的数据并发送数据

Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if (comdata.length() > 0) { Serial.print("串口接收到的数据:"); Serial.println(comd

perseverance51博客 1万+

图解反转单向链表

我总觉的反转链表的过程不是那么好理解,花了点时间画图来帮助理解

yinhuanxu 8284

23、视频时间码与数字同步技术详解

本文深入解析了视频时间码与数字同步技术的核心原理及应用。涵盖线性时间码(LTC)和垂直间隔时间码(VITC)的结构与特性,详细阐述了降帧时间码的补偿机制及其在影视制作中的重要性。文章还介绍了定时参考信号(TRS)在SDTV和HDTV中的实现方式,分析了辅助数据的传输结构与发展趋势,并探讨了SDI编码技术及其在不同视频标准下的差异。通过实际应用场景和技术发展影响的剖析,全面展示了这些关键技术如何支撑现代视频系统的高效运行与持续创新。

wine的专栏 236

一步一步写算法(之双向链表)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     前面的博客我们介绍了单向链表。那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针。双向链表相比较单向链表,主要有下面几个特点:     (1)在数据结构中具有双向指针     (2)插入数据的时候需要考虑前后的方向的操作     (3)同样,删

嵌入式-老费,一个分享专业嵌入式知识的blog 8万+

用 Joule 点燃 ABAP 开发者的舞台感:SAP BTP 上的 ABAP AI 能力实战解读

摘要:SAP推出的Joule for developers和ABAP AI功能为开发者提供了智能辅助工具,旨在优化ABAP开发流程。主要功能包括上下文感知的代码预测补全、代码解释、单元测试生成和开发问题实时解答。这些能力特别适合应对Cloud环境下ABAP开发的复杂约束,如Clean Core原则和受限语法范围。通过减少重复劳动和提升代码理解效率,该工具帮助开发者将注意力集中在业务逻辑而非技术细节上。随着企业加速向S/4HANA迁移,这些AI功能将在遗留代码改造和云适配中发挥更大作用,建议团队将其纳入工程体

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

单向链表中循环的查找方法总结

一个单向链表中可能存在循环,如何判断单向链表中是否存在循环,又如何找到循环部分的起始节点?如果是非循环链表,如何找到中间节点? 本文结合网上找到的资料及自己的分析,进行了总结。

zfs2008zfs的博客 1757

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

每日一课 | 单向链表、双向链表和循环链表图文解析

02.单向链表、双向链表、循环链表大家好,我是营长,上期给大家分享——数组内存及数组面试常问算法全解析本期分享内容:单向链表、双向链表和循环链表图文解析本期邀请的是春晨溅雨·4位算法工程...

Python大本营的博客 1466

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【数据结构和算法】认识线性表中的链表,并实现单向链表

本文主要讲解了链表的分类是什么,两种常用的类型,无头单向非循环链表、有头双向循环链表,我们实现了无头单向非循环链表,这是比较简单的一种链表的实现,我们使用的是二级指针传参,当然使用一级指针传参也可以,主要实现函数为头尾插入,头尾删除,pos指定结点位置前后添加或者删除元素。

小王学代码 1555

一步一步写算法(之单向链表)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一

嵌入式-老费,一个分享专业嵌入式知识的blog 12万+
上一篇: 一步一步写算法(之双向链表)
下一篇: 一步一步写算法(之链表逆转)
heary29
博客等级 码龄12年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值