数据结构——快慢指针(十五)

一、建立双向链表

struct Node

{

int a;

struct Node* pNext;//后续指针

struct Node* pPre;//前驱指针

};

int main(void)

{

struct Node head = { 0 };

head.pNext = &head;

head.pPre = &head;

head.a = -1;

system("pause>0");

return 0;

}

  • a:节点的数据字段,存储整型值。
  • pNext:指向下一个节点的指针。
  • pPre:指向前一个节点的指针。
  • 初始化头节点 head,所有字段初始化为 0
  • head.pNexthead.pPre 均指向自身,形成一个空的双向循环链表。
  • head.a 被赋值为 -1,作为头节点的标记值。

尾添加

void AddToEnd(struct Node* head, int iData)//尾添加

{

//参数合法性检测

if (NULL == head)

return;

//申请节点

struct Node* pTemp = (struct Node*)malloc(sizeof(struct Node));

if (NULL == pTemp)

return;

pTemp->a = iData;

pTemp->pNext = NULL;

pTemp->pPre = NULL;

//链接

//先连

pTemp->pNext = head;

pTemp->pPre = head->pPre;

//后断

head->pPre->pNext = pTemp;

head->pPre = pTemp;

}

参数合法性检测

检查传入的头节点指针 head 是否为 NULL。如果是,函数直接返回,避免后续操作引发错误。

申请新节点

动态分配内存创建一个新节点 pTemp。如果内存分配失败(pTempNULL),函数直接返回。否则,初始化新节点的数据域 aiData,并将前后指针 pNextpPre 初始化为 NULL

链接新节点

  1. 将新节点 pTemppPre 指向头节点的前驱节点(即链表的尾节点)。

  2. 将新节点 pTemppNext 指向头节点 head

  3. 将原尾节点的 pNext 指向新节点 pTemp

  4. 将头节点的 pPre 指向新节点 pTemp,完成尾添加操作。

二、检测链表是否有环

bool QuiKSlow(struct Node* head)//检测链表是否有环

{

//参数合法性检测

if (NULL == head )

return false;

//快慢指针

struct Node* quik = head->pNext;//快指针

struct Node* slow = head->pNext;//慢指针

while (NULL != quik && NULL != quik->pNext)

{

slow = slow->pNext;

quik = quik->pNext->pNext;

if (slow == quik)

return true;

}

//链表无环

return false;

}

检测单向链表是否存在环。快指针每次移动两步,慢指针每次移动一步,若存在环,两者最终会相遇。

布尔(bool

布尔(bool)是编程中的基本数据类型,表示逻辑值,仅有两种可能:true(真)或 false(假),头文件是<stdbool.h>。

执行逻辑

参数合法性检测

检查传入的头节点指针 head 是否为 NULL。如果是,函数返回false(假),避免后续操作引发错误。

循环遍历阶段

快指针每次移动两步quik = quik->pNext->pNext,慢指针每次移动一步slow = slow->pNext。每次移动后检查快慢指针是否相遇if (slow == quik),若相遇则存在环并返回true(真)。

终止条件

循环终止条件为快指针或其下一节点为NULL,表明链表已遍历完毕且未发现环,最终返回false

检测:

让链表变成环,让尾节点的后续指针指向第二个节点,形成一个环。

head.pPre->pNext = head.pNext->pNext;

bool res = QuiKSlow(&head);

形成了一个环,检测函数返回了true表示有环状。

相关推荐
小江的记录本4 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈6 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
yuannl108 小时前
数据结构----二叉排序树(ai修改版)
数据结构
iiiiyu8 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本8 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程
go不是csgo9 小时前
两个Redis数据结构搞定签到和UV统计:Bitmap与HyperLogLog实战
数据结构·redis·uv
悠仁さん10 小时前
数据结构 栈与队
数据结构
Plan-C-10 小时前
二叉树的遍历
java·数据结构·算法
历程里程碑10 小时前
54 深入解析poll多路复用技术
java·linux·服务器·开发语言·前端·数据结构·c++