思路:判断链表中是否有环,可以使用快慢指针(fast low)遍历链表实现,fast每次走两步,low每次走一步,如果他们在链表中相遇,则说明有环,否则fast提前遇上NULL,说明链表无欢。

关键代码:

//判断环
int link_list_judge(node *head)
{//定义fast low指针,分别从head开始遍历node *fast,*low;fast=low=head;//fast每次循环两次,low每次前进一位while(fast->next&&low->next)       //关键步骤:循环退出条件{//low指针出发low=low->next;//fast指针出发(并判断)if((fast=fast->next->next)==NULL){printf("链表无环!\n");return 0;      }else if(fast==low){printf("链表有环!\n");return 1;      //返回整型数值进行判断}}return 0;
}

循环退出条件:循环开始,需判断fast->next是否是有效节点,利用和low指针的与逻辑操作,可实现,当然这样也可实现判断链表可能为空的情况,fast指针指向第二个节点(不包含head)时,需判断fast当前存入的地址。

完整代码:

/*分析:链表中如果存在环,那么链表尾节点一定不指向NULL,并且会产生循环解题思路:对要判断的链表,从头结点开始,遍历链表,直到遇到第二个相同的节点具体解题思路:利用快慢指针(双指针)设计两个指针fast和low,fast和low从同一位置同时出发(head),fast每次走两步,low每次走一步,如果fast遇到NULL,说明该链表没环;
*/#include <stdio.h>
#include <stdlib.h>// 节点设计
typedef struct node
{int data;struct node *next;
} node;// 函数声明
//  初始化节点
node *link_list_init(void);
// 头插
void link_list_add(node *head, int add_data);
// 尾插
void link_list_add_tail(node *head, int add_data);
// 遍历链表
void link_list_show(node *head);
// 生成环
void link_list_ring(node *head);
// 尾节点寻找函数
node *link_list_tail(node *head);
// 遍历带环链表
void link_list_show_ring(node *pos, node *head);
//判断环
int link_list_judge(node *head);// 主函数(单向不循环链表)
int main(int argc, char const *argv[])
{// 创建空链表node *head = link_list_init();// 循环输入数据int cmd;while (1){printf("Pls enter the num!:");scanf("%d", &cmd);while (getchar() != '\n');if (cmd > 0){link_list_add_tail(head, cmd); // 添加数据link_list_show(head);}else if (cmd == 0)link_list_ring(head); // 生成环else{                         // elselink_list_judge(head); // 判断环//printf("head_:%d\n",head->next->data);}}return 0;
}// 初始化节点
node *link_list_init(void)
{// 申请堆空间node *new = malloc(sizeof(node));// 判断能否正常申请堆空间if (new == NULL){printf("malloc failed\n");return NULL;}// 新节点数据域清空和指针域处理new->data = 0;new->next = NULL;// 返回新节点return new;
}// 头插
void link_list_add(node *head, int add_data)
{// 申请新节点空间node *new = link_list_init();// 新节点数据域new->data = add_data;// 新节点指针域new->next = head->next;head->next = new;
}// 尾插
void link_list_add_tail(node *head, int add_data)
{// 定义指针寻找尾节点node *pos = head;while (pos->next != NULL){pos = pos->next;}// 参数传递给头函数进行头插入链link_list_add(pos, add_data);
}// 遍历链表
void link_list_show(node *head)
{// 定义指针遍历链表node *pos = head->next;for (pos; pos != NULL; pos = pos->next)printf("%d ", pos->data);printf("\n");
}// 遍历带环链表
void link_list_show_ring(node *pos, node *head)
{printf("环中链表:");node *u = pos;do{printf("%d ", u->data);u=u->next;}while(u!=pos);printf("\n");
}// 生成环
void link_list_ring(node *head)
{if(head->next==NULL){printf("空链表,头结点既是环本身!\n");return ;}int j=link_list_judge(head);if(j==1){printf("停止生成链环!\n");return ;}printf("环节点之前的整链表:");link_list_show(head);// 自定义指向节点int dd;printf("请输入要从哪个数据开始成环:");scanf("%d", &dd);while (getchar() != '\n');// 定义指针寻找目的节点node *pos = head->next;while (dd != pos->data){pos = pos->next;if (pos == NULL){printf("匹配失败!\n");return;}}// 匹配成功,tail指向该结点,形成环link_list_tail(head)->next = pos;printf("已形成环!\n");link_list_show_ring(pos, head);
}// 尾节点寻找函数
node *link_list_tail(node *head)
{node *pos = head;while (pos->next != NULL)pos = pos->next;return pos;
}//判断环
int link_list_judge(node *head)
{//定义fast low指针,分别从head开始遍历node *fast,*low;fast=low=head;//fast每次循环两次,low每次前进一位while(fast->next&&low->next)       //关键代码:循环结束条件{low=low->next;//双指针开始出发//由于fast要移动两位,为防止fast溢出链表,fast每次前进都需要检查当前fast结点if((fast=fast->next->next)==NULL){printf("链表无环!\n");return 0;        }else if(fast==low){printf("链表有环!\n");return 1;      //返回整型数值进行判断}}return 0;
}

判断链表中是否有环链相关推荐

  1. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  2. 判断链表中是否有环(环形链表)

    题意: 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位 ...

  3. 牛客题霸 判断链表中是否有环 C++题解/答案

    牛客题霸 判断链表中是否有环 C++题解/答案 题目描述 判断给定的链表中是否有环 扩展: 你能给出空间复杂度的解法么? 题解: 在这介绍一个简便的方法:快慢指针 就是:一个指针走两步,一个指针走一步 ...

  4. 如何判断链表中存在环路

    如果你曾经想过要参加面试,像我一样,你一定看过这个问题:如何判断链表中存在环路.(我不太清楚这个问题的应用在哪里,烦请各位读者能够提示一下.) 先简单说一下我之前看到的方法. 方法一:蛮力法. 方法二 ...

  5. 1:算法php/go [反转链表;LRU缓存结构 ;判断链表中是否有环]

    目录 2021-12-01反转链表 12/10 设计LRU缓存结构 (参考牛客网) 判断链表中是否有环(参考牛客网) 给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头. 数据 ...

  6. 环形链表。给定一个链表,判断链表中是否有环。(GO、PHP)

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  7. 快慢指针判断链表中是否存在环以及查找环的起始位置

    判断链表中是否有环?    使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢?    因为slow指针和fast指针 ...

  8. 给定一个链表,判断链表中是否有环

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  9. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

最新文章

  1. 发现了阿里云 APP 的一个小 BUG
  2. mysql 实现按首字母字典序排序以及根据字段汉字首字母搜索
  3. android下m、mm、mmm编译命令的使用
  4. ds18b20c语言显示小数位,DS18B20多点测温(读序列,匹配序列,51单片机C程序,1602显示)...
  5. 中考英语听说计算机考试满分,中考英语听说机考在即,这些考生可免试计满分...
  6. 使用NPOI——C#和WEB API导出到Excel
  7. python wechatpay微信支付回调_python服务器 实现app微信支付:支付异步通知
  8. append在python中是什么意思_append在python里是什么意思
  9. Linux lamp环境验证码无法显示
  10. 【数学建模】论文模板和latex模板
  11. java并发编程 pdf_Java并发编程实战 PDF
  12. 全屏模式fullscreen
  13. 人大金仓助力广东融合创新智慧校园建设与网络安全交流会成功举办
  14. python查找文件指定内容_python实现在目录中查找指定文件的方法
  15. java 微信支付 NATIVE + 生成二维码
  16. centos 7 系统安装
  17. 流向的改变(direciton与unicode-bidi)
  18. 堆分配存储结构串的实现|C++
  19. linux系统磁盘分区查看,linux下磁盘查看和分区
  20. Aria2 使用手札(简易部署 + 快速进阶)

热门文章

  1. CTF-网络信息安全攻防学习平台(基础关)
  2. 常用类-String类
  3. windows下的cd命令
  4. MyBatis——谈谈占位符(#、$)的理解与使用
  5. 找到数组中唯一或者唯二的数
  6. 抗体纯化策略——介质篇
  7. 教学资源c语言1级,《c语言程序设计》课程的教学资源建设.doc
  8. 仿牛客网社区项目 全栈总结
  9. Java入门小练习:根据年份输出对应的生肖
  10. Intellij热部署插件Jrebel安装详解(2020新版或以前旧版)