单链表中环的检测
来源:互联网 发布:固定收益类投资 知乎 编辑:程序博客网 时间:2024/06/05 10:08
利用上一篇文章“单向带环链表的创建”中所讲知识,创建如下带环链表:
检测环的常用方法为快慢指针方法。如果快慢指针相遇,则说明存在环,本文中将返回相遇结点的数值;如果快指针的next为空时,则说明不存在环。本文中慢指针一次移动一个结点,快指针一次移动2个结点。
(1)
//带环链表的检测 快慢指针pNode IsCircle(pNode head){ pNode fast,slow; fast=slow=head; if(NULL==head->next) { printf("只有一个头结点!");return NULL; } else if(NULL==head->next->next) { printf("只有2个结点!"); return NULL; } else { fast=fast->next->next; while((NULL!=slow)&&(NULL!=fast)){ if(fast==slow) { return fast; //返回相遇结点 } else { if(NULL==fast->next) { return NULL; } slow=slow->next; fast=fast->next->next; }} }}
从上述代码中,我们可以看出,在循环前,让快指针先移动2个结点至第2个结点(数据为10的结点),经过推导,快慢指针是在数据为7的结点相遇。
int _tmain(int argc, _TCHAR* argv[]){type a[9]={11,10,9,8,7,6,5,4,2};pNode p=CreateList_Circle(a,9,3);pNode temp=IsCircle(p);if(NULL!=temp){printf("存在环,相遇结点数据为%d",temp->data);}else{printf("不存在环!");}return 0;}
程序结果为:
(2)上述方法相当于快指针比慢指针快上2步。如果快慢指针同时出发,则代码如下:
//带环链表的检测2 快慢指针pNode IsCircle1(pNode head){ pNode fast,slow; fast=slow=head; bool flag =false; if(NULL==head->next) { printf("只有一个头结点!");return NULL; } else if(NULL==head->next->next) { printf("只有2个结点!"); return NULL; } else {while((NULL!=fast)&&(NULL!=fast->next)){ slow=slow->next; fast=fast->next->next; if(fast==slow) { flag=true; //返回相遇结点break; } } } if(true==flag) { return fast; } else { return NULL; }}
则运行结果为:
相遇点是不同的。
0 0
- 单链表中环的检测
- 单链表中环的检测
- 人脸检测的harr检测函数
- vmware的检测与反检测
- 指标的检测及检测仪器
- 运动物体的检测--对视频检测
- 检测字符的代码
- 对数字的检测
- 灰鸽子的手工检测
- 浏览器的支持检测
- 检测平台的Endian
- as3的hit检测
- 内存泄漏的检测
- 检测浏览器的js
- 内存泄露的检测
- 显示器的信息检测
- 数字图像的边缘检测
- 将要检测的博客
- 获取一个包和子包下面所有的类
- 设计模式之中介者模式
- 【剑指offer】出现次数超过一半的数字
- JSP 列出服务器环境变量
- 一些ios中高效的开源类库
- 单链表中环的检测
- RadAsm:object file not found
- 基于Ext Core的包含校验功能的表单提交扩展Ext.ux.submit
- 黑马程序员--交通灯系统
- JSP内置对象之response对象
- 移动互联网创业得屌丝者得天下
- 利用tr命令轻松实现大小写转换
- Hadoop实战-中高级部分 之 Hadoop作业调优参数调整及原理
- JSP内置对象之session对象简介及调用方法