寻找单向循环链表的环的开始结点
2015-09-24 20:26
381 查看
struct node { int data; node* next; }
例如链表:
A -> B -> C -> D -> E -> C。
问题:给定一个循环链表,判断链表是否存在循环。
分析:本题的思路是设置两个指针P1,P2。
其中P1的速度为1,即每次走一个结点;P2的速度为2,即每次走两个结点。只要指针不为空,判断P1与P2是否相等,如果某次循环中P1==P2,则可以判断有循环。
当然如果传入的链表为null,则不存在循环不循环。所以返回false。
代码:
bool circle(node* head) { if (head == NULL) return false; bool flag = false; node *p1=head, *p2=head; while (p1 && p2) { if (p2) p2 = p2->next; if (p2) p2 = p2->next; else return false; if (p1) p1 = p1->next; else return false; if (p1==p2) return true; } }
问题:给定一个循环链表,实现算法返回这个环的开始结点。
例如链表:
A -> B -> C -> D -> E -> C。
输出:C
分析:这个题其实是很多公司的面试题,不废话了,直接上思路。
代码:
node* circle(node* head) { if (head == NULL) return false; bool flag = false; node *p1=head, *p2=head; while (p1 && p2) { if (p2) p2 = p2->next; if (p2) p2 = p2->next; else return NULL; if (p1) p1 = p1->next; else return NULL; if (p1==p2) break; } while (p1 && head) { p1 = p1->next; head = head->next; if (p1==head) break; } return p1; }
相关文章推荐
- JAVA类的方法调用和变量(全套)
- 0923Android基础代码管理工具SVN
- sort 使用简介
- PackageManager获取指定类别应用程序
- S5PV210的启动流程解读
- JS模拟简易滚动条
- 如何使用socket进行java网络编程(二)
- 设计模式之禅之六大设计原则-单一职责原则
- iOS开发开关
- Android samples API Demos之UI篇2(ActivitySceneTransitionBasic)
- Diskpart - convert disk to gpt format
- 【正则表达式】——限制只能输入数字和小数点及位数
- 《MySQL技术内幕:InnoDB存储引擎》第2版笔记
- 小到极致的单文件记事本替换工具合集:
- 网站无端卡死
- unsigned int reverse_bit(unsigned int value)
- windows下php+mysql+apache环境集成 简易版
- STL系列之二 stack栈
- UIStepper
- Android Handler 用法解析