-判断链表是否带环?若带环求环的长度?若带环求环的入口点
1.链表是否有环
/*struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
bool EntryNodeOfLoop(ListNode* pHead)
{
ListNode*P1=pHead;
ListNode*P2=pHead;
while(P1!=NULL&&P1->next!=NULL){
P1=P1->next->next;
P2=P2->next;
if(P1==P2)
return true;
}
return false;
}
};
2.环的长度
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
int EntryNodeOfLoop(ListNode* pHead)
{
ListNode*P1=pHead;
ListNode*P2=pHead;
while(P1!=NULL&&P1->next!=NULL){
P1=P1->next->next;
P2=P2->next;
if(P1==P2){
p2=P2->next;
int i=1;
while(P1!=P2){
P2=P2->next;
i++;
}
return i;
}
}
return 0;
}
};
3.判断环的入口
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode*P1=pHead;
ListNode*P2=pHead;
while(P1!=NULL&&P1->next!=NULL){
P1=P1->next->next;
P2=P2->next;
if(P1==P2){
P2=pHead;
while(P1!=P2){
P2=P2->next;
P1=P1->next;
}
return P1;
}
}
return NULL;
}
};