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

一、建立双向链表

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表示有环状。

相关推荐
find1star31 分钟前
LeetCode 25:K 个一组翻转链表
java·数据结构·算法·leetcode·链表·职场和发展·动态规划
ysu_03141 小时前
13-图的基础:存储与表示
数据结构·
青山木2 小时前
Hot 100 --- 划分字母区间
java·数据结构·算法·leetcode·贪心算法
橘子汽水1683 小时前
Leetcode 208,207实现Trie前缀树,课程表
java·数据结构·算法·leetcode
wabs6663 小时前
关于二叉树【力扣116.填充每个节点的下一个右侧节点指针的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
船厂电气自动化ai大模型3 小时前
AI大模型与数学 第73课 秩的核心定义、矩阵秩的通用求解方法
开发语言·数据结构·机器学习
动词ing3 小时前
【学习笔记】数据结构(哈希表基础+哈希集合+哈希映射+计数+查找)
数据结构·学习·哈希算法
不会就选b13 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
爱吃苹果的日记本15 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#