C/C++,图算法——布伦特循环检测算法(Brent‘s cycle detection algorithm)的源程序

1 文本格式

// CPP program to implement Brent's cycle  
// detection algorithm to detect cycle in 
// a linked list. 
#include <stdio.h> 
#include <stdlib.h> 

/* Link list node */
struct Node { 
    int data; 
    struct Node* next; 
}; 

/* This function detects loop in the list 
If loop was there in the list then it returns, 
the first node of loop otherwise returns NULL */
struct Node* detectCycle(struct Node* head) 

    // if head is null then no loop 
    if (head == NULL)  
        return NULL;     

    struct Node* first_pointer = head; 
    struct Node* second_pointer = head->next; 
    int power = 1; 
    int length = 1; 

    // This loop runs till we find the loop. 
    // If there is no loop then second_pointer 
    // ends at NULL . 
    while (second_pointer != NULL &&  
           second_pointer != first_pointer) { 

        // condition after which we will 
        // update the power and length as 
        // smallest power of two gives the 
        // start of cycle. 
        if (length == power) { 

            // updating the power. 
            power *= 2; 

            // updating the length 
            length = 0; 

            first_pointer = second_pointer; 
        } 

        second_pointer = second_pointer->next; 
        ++length; 
    } 

    // if it is null then no loop 
    if (second_pointer == NULL)  
        return NULL;     

    // Otherwise length stores actual length  
    // of loop. 
    // If needed, we can also print length of 
    // loop. 
    // printf("Length of loop is %d\n", length); 

    // Now set first_pointer to the beginning 
    // and second_pointer to beginning plus 
    // cycle length which is length. 
    first_pointer = second_pointer = head; 
    while (length > 0) { 
        second_pointer = second_pointer->next; 
        --length; 
    } 

    // Now move both pointers at same speed so 
    // that they meet at the beginning of loop. 
    while (second_pointer != first_pointer) { 
        second_pointer = second_pointer->next; 
        first_pointer = first_pointer->next; 
    } 

    // If needed, we can also print length of 
    // loop. 
    // printf("Length of loop is %d", length); 

    return first_pointer; 

struct Node* newNode(int key) 

    struct Node* temp =  
      (struct Node*)malloc(sizeof(struct Node)); 
    temp->data = key; 
    temp->next = NULL; 
    return temp; 

// Driver program to test above function 
int main() 

    struct Node* head = newNode(50); 
    head->next = newNode(20); 
    head->next->next = newNode(15); 
    head->next->next->next = newNode(4); 
    head->next->next->next->next = newNode(10); 

    // Create a loop for testing  
    head->next->next->next->next->next =  
                              head->next->next; 

    Node *res = detectCycle(head); 
    if (res == NULL) 
        printf("No loop"); 
    else
        printf("Loop is present at %d", res->data); 
    return 0; 

2 代码格式

// CPP program to implement Brent's cycle  
// detection algorithm to detect cycle in 
// a linked list. 
#include <stdio.h> 
#include <stdlib.h> /* Link list node */
struct Node { int data; struct Node* next; 
}; /* This function detects loop in the list 
If loop was there in the list then it returns, 
the first node of loop otherwise returns NULL */
struct Node* detectCycle(struct Node* head) 
{ // if head is null then no loop if (head == NULL)  return NULL;     struct Node* first_pointer = head; struct Node* second_pointer = head->next; int power = 1; int length = 1; // This loop runs till we find the loop. // If there is no loop then second_pointer // ends at NULL . while (second_pointer != NULL &&  second_pointer != first_pointer) { // condition after which we will // update the power and length as // smallest power of two gives the // start of cycle. if (length == power) { // updating the power. power *= 2; // updating the length length = 0; first_pointer = second_pointer; } second_pointer = second_pointer->next; ++length; } // if it is null then no loop if (second_pointer == NULL)  return NULL;     // Otherwise length stores actual length  // of loop. // If needed, we can also print length of // loop. // printf("Length of loop is %d\n", length); // Now set first_pointer to the beginning // and second_pointer to beginning plus // cycle length which is length. first_pointer = second_pointer = head; while (length > 0) { second_pointer = second_pointer->next; --length; } // Now move both pointers at same speed so // that they meet at the beginning of loop. while (second_pointer != first_pointer) { second_pointer = second_pointer->next; first_pointer = first_pointer->next; } // If needed, we can also print length of // loop. // printf("Length of loop is %d", length); return first_pointer; 
} struct Node* newNode(int key) 
{ struct Node* temp =  (struct Node*)malloc(sizeof(struct Node)); temp->data = key; temp->next = NULL; return temp; 
} // Driver program to test above function 
int main() 
{ struct Node* head = newNode(50); head->next = newNode(20); head->next->next = newNode(15); head->next->next->next = newNode(4); head->next->next->next->next = newNode(10); // Create a loop for testing  head->next->next->next->next->next =  head->next->next; Node *res = detectCycle(head); if (res == NULL) printf("No loop"); elseprintf("Loop is present at %d", res->data); return 0; 
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…

CCF计算机软件能力认证202309-2坐标变换(其二)(C语言)

ccf-csp计算机软件能力认证202309-2坐标变换&#xff08;其二&#xff09;(C语言版) 题目内容&#xff1a; 问题描述 输入格式 输出格式 样例输入 10 5 2 0.59 2 4.956 1 0.997 1 1.364 1 1.242 1 0.82 2 2.824 1 0.716 2 0.178 2 4.094 1 6 -953188 -946637 1 9 96953…

计算机网络之网络传输,三次握手和四次挥手

网络传输通过高低电压 流 基本类型数组 低电压转高电压&#xff0c;通过网卡 传输模式&#xff1a; 全双工&#xff1a;互相传输且能同时传输 半双工&#xff1a;互相传输但是不能同时传输 单工&#xff1a;单向传输&#xff0c;&#xff08;键盘&#xff0c;显示器&#…

kubernetes详解——从入门到入土(更新中~)

k8s简介 编排工具&#xff1a;系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose&#xff1a;实现单机容器编排docker swarm&#xff1a;实现多主机整合成为一个docker machine&#xff1a;初始化新主机mesos marathonmesos …

微信小程序查看接口信息(抓包)

本文仅供交流学习使用 主要参考: https://cloud.tencent.com/developer/article/1833591 https://www.cnblogs.com/x1you/p/12033839.html 由于参考文章在baidu权重不高(google才查到的), 所以自己重新记录一篇, 方便他人, 也防止参考文章丢失. 背景 需要知道微信小程序的接口…

8、Broker进一步了解

1、Broker消息分发服务以及构建ConsumeQueue和IndexFile与消息清除 前面分析如何进行刷盘&#xff0c;本章分析Broker的消息分发以及构建ConsumerQueue和IndexFile&#xff0c;两者构建是为了能够提高效率&#xff0c;减少消息查找时间以及减少网络带宽与存储空间。 ConsumeQ…

mac电池最大充电限制工具 AlDente Pro中文 for Mac

Pro 版特有功能 热保护&#xff1a;在电池温度较高时为电池充电会导致电池老化更快。启用热保护后&#xff0c;当电池温度过高时&#xff0c;充电将自动停止。 航行模式&#xff1a;通常情况下&#xff0c;即使激活了最大电池充电&#xff0c;您的 MacBooks 电池也会始终稍微充…

7.上传project到服务器及拉取服务器project到本地、更新代码冲突解决

1.上传project到SVN服务器 1.在eclipse中&#xff0c;从show view里调出SVN资源库视图 2.在SVN资源库窗口的空白位置右键选择新建资源库位置 3.填好服务器的地址 4.资源库导入成功,SVN资源库视图下出现导入的资源库 5.新建project 6.写好project的初始版本 7.右键project --&…

激光雷达生成的图像检测关键点用来辅助里程计的方案

文章&#xff1a;LiDAR-Generated Images Derived Keypoints Assisted Point Cloud Registration Scheme in Odometry Estimation 作者&#xff1a;Haizhou Zhang , Xianjia Yu, Sier Ha , Tomi Westerlund 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF…

数据结构与算法编程题41

线性表中各结点的检索概率不等时&#xff0c;可用如下策略提高顺序检索的效率&#xff1a; 若找到指定的结点&#xff0c;则将该结点和其前驱结点&#xff08;若存在&#xff09;交换&#xff0c;使得经常被检索 的结点尽量位于表的前端。试设计在顺序结构的线性表上实现上述策…

DCGAN生成网络模型

DCGAN&#xff08;Deep Convolutional Generative Adversarial Network&#xff09;是一种生成对抗网络&#xff08;GAN&#xff09;的变体&#xff0c;专门设计用于生成图像。它结合了卷积神经网络&#xff08;CNN&#xff09;和生成对抗网络的概念&#xff0c;旨在生成具有高…

mysql基础之DQL基本单表查询

学习DQL之前先知道sql语句的执行顺序 from->join->on->where->group by->count(字段)->having->select->distinct->order by->limit null无法和任何值进行比较&#xff08;不相等&#xff09;&#xff0c;包括null和null也不相等 1.DQL简单查询…

免费好用的5个AI写作工具,如何更好的使用AI写作工具

人工智能&#xff08;AI&#xff09;作为当今科技领域的热门话题&#xff0c;正在以惊人的速度改变我们生活的方方面面。从智能助手到自动驾驶汽车&#xff0c;AI的应用已经渗透到我们日常的方方面面。 1. 什么是AI人工智能&#xff1f; 什么是AI人工智能&#xff1f;简而言之…

CCF编程能力等级认证GESP—C++1级—20230318

CCF编程能力等级认证GESP—C1级—20230318 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)每月天数长方形面积 答案及解析单选题判断题编程题1编程题2 单选…

会声会影2024软件还包含了视频教学以及模板素材

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能&#xff0c;用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材&#xff0c;让用户剪辑视频更加的轻松。 会…

基于springboot+vue篮球联盟管理系统源码

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎交流&#xff1a; 二、文档资料截图&#xff1a; 三、项目技术栈 四、项目运行图 背景&#xff1a; 篮球运…

对比分析:黑盒测试 VS 白盒测试

一、引言 在软件开发过程中&#xff0c;测试是确保产品质量的关键环节。其中&#xff0c;黑盒测试和白盒测试是两种常见的测试方法。本文将详细解析这两种测试方法的定义、特点&#xff0c;同时通过具体示例进行对比分析。 二、黑盒测试 黑盒测试&#xff0c;又称功能测试&…

社区分享|简米Ping++基于MeterSphere开展异地测试协作

上海简米网络科技有限公司&#xff08;以下简称为“简米”&#xff09;是国内开放银行服务商&#xff0c;高新技术企业&#xff0c;中国支付清算协会会员单位。自2014年成立至今&#xff0c;简米长年聚焦金融科技领域&#xff0c;通过与银行、清算组织等金融机构合作&#xff0…

java基础进阶之数组排序-可能有你不知道的哦!!

1、使用Arrays类的sort方法 1.1、默认升序 java中Arrays类提供了sort方法来进行快速排序&#xff0c;默认是升序的。 Arrays.sort(数组名) private static void ArrSort1(int[] arr) {Arrays.sort(arr);System.out.println("快速排序-默认升序:"Arrays.toString(arr…

【PyTorch】多项式回归

文章目录 1. 模型与代码实现1.1. 模型1.2. 代码实现1.2.1. 完整代码1.2.2. 输出结果 2. Q&A2.1. 欠拟合与过拟合 1. 模型与代码实现 1.1. 模型 将多项式特征值预处理为线性模型的特征值。即 y w 0 w 1 x w 2 x 2 ⋯ w n x n y w_0w_1xw_2x^2\dotsw_nx^n yw0​w1​…