主要利用快慢指针来解答,可以判断链表中是否有环,也可以找出链表中环的入口。
(1)判断链表中是否有环
新建两个指针,一快一慢,开始都指向头结点,一般快指针的速度是慢指针的两倍。这样如果快慢指针相遇,那么链表中一定有环。
bool hasCycle(ListNode *head) { if(!head) return false; ListNode *fast; ListNode *slow; fast=slow=head; while(fast!=NULL && fast->next!=NULL) { slow=slow->next; fast=fast->next->next; if(fast==slow) return true; } return false; }
(2)找出环的入口
同样用快慢指针处理,不过处理方式有所改变。当第一次快慢指针相遇时,将快指针指向链表的头结点,慢指针位置不变,然后同时开始移动,每次移动一位,当两者第二次相遇就是环的起始位置。
ListNode *detectCycle(ListNode *head) { if(!head) return NULL; int num=0; ListNode *fast,*slow; fast=slow=head; while(fast!=NULL && fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if(slow==fast) { fast=head; break; } } while(fast!=NULL && fast->next!=NULL) { if(fast==slow) return slow; fast=fast->next; slow=slow->next; } return NULL; }