给出如下结构:
struct node
{
struct *next;
};
typedef stuct node Node;
bool getCycle(){
Node* temp1 = head;//(假设head就是这个链表的头)
Node* temp2 = head;
while(head->next!=NULL)
{
temp1 = temp1->next;//步长为1
temp2 = temp2->next->next;//步长为2
if(temp1 == temp2)
return ture;
head=head->next;
}
return false;
//p2每次走二步,直到p1==p2找到在环中的相汇点。
//第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,
//设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,
//再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL)
return NULL;
ListNode* p1 = pHead;
ListNode* p2 = pHead;
while(p2 != NULL && p2->next != NULL ){
p1 = p1->next;
p2 = p2->next->next;
if(p1 == p2){
p2 = pHead;
while(p1 != p2){
p1 = p1->next;
p2 = p2->next;
}
if(p1 == p2)
return p1;
}
}
return NULL;
}
};
struct node
{
struct *next;
};
typedef stuct node Node;
bool getCycle(){
Node* temp1 = head;//(假设head就是这个链表的头)
Node* temp2 = head;
while(head->next!=NULL)
{
temp1 = temp1->next;//步长为1
temp2 = temp2->next->next;//步长为2
if(temp1 == temp2)
return ture;
head=head->next;
}
return false;
}
写一段代码判断一个单向链表中是否有环。
原理:
设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇,(注意:这里快指针不会跳过慢指针而不相遇,因为它每次都只比慢指针多走一个单位) bool judge(list *head){if(head == NULL){return false;//没有环} list *pFast = head; list *pSlow = head; while(pFast-next != NULL && pFast-next-next != NULL){pFast = pFast-next-next; pSlow = pSlow-next;
http://blog.csdn.net/guoyong10721073/article/details/8144401
多种思路:
http://blog.csdn.net/htyurencaotang/article/details/11481875
http://www.cnblogs.com/shuaiwhu/archive/2012/05/03/2480509.html
http://www.xuebuyuan.com/1570516.html
为啥步长是1?
http://blog.chinaunix.net/uid-21393885-id-88130.html
综合:http://blog.csdn.net/thefutureisour/article/details/8174313
http://www.cnblogs.com/zhyg6516/archive/2011/03/29/1998831.html
题目描述
一个链表中包含环,请找出该链表的环的入口结点。
//第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,
//p2每次走二步,直到p1==p2找到在环中的相汇点。
//第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,
//设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,
//再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL)
return NULL;
ListNode* p1 = pHead;
ListNode* p2 = pHead;
while(p2 != NULL && p2->next != NULL ){
p1 = p1->next;
p2 = p2->next->next;
if(p1 == p2){
p2 = pHead;
while(p1 != p2){
p1 = p1->next;
p2 = p2->next;
}
if(p1 == p2)
return p1;
}
}
return NULL;
}
};