1判断链表是否有环?
bool IsExitsLoop(sList *head){
sList *slow=head;
sList *fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) break;
}
return !(fast == NULL || fast->next==NULL);
}
2 找环的入口点
设整个链表长度为L,环长度为r,入口环与相遇点距离为x,起点到环入口点的距离为a。
对于slow走了s,则fast走了2s
s=a+x;
2s=a+nr+x;
==>a+x=nr;
设相遇点到入口环的距离为y=r-x,==>a=(n-1)r+y
因此我们设定一个指针p,指向相遇点,指针q从head出发,这样他们一定会在环入口相遇,由此我们得到环入口
sList *findLoopPort(sList *head){
sList *slow=head,*fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) break;
}
if(fast==NULL || fast->next==NULL){
return (sList *)NULL;
}
slow=head;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
3判断两个链表是否相交(链表不存在环)
方法一:
将其中一个链表,首尾相连,检测两外一个链表是否有环,如果存在,则代表两个链表相交,检测出来的环入口点,即为相交点
方法二:
如果两个链表相交,则从相交点开始,到链表结束都是相同的节点,我们可以先遍历一个链表直到尾部,再遍历一个链表,如果也走到相同的尾部,则相交。
此时我们记录两个链表的length,利用length1-length2,然后这样使得两个链表出发点到相交点长度是一致的,之后两个链表指针相同步伐前进,相遇的第一个点为
相交点。