算法思路:考虑使用快慢双指针。慢指针每次走一步,快指针每次走两步,如果链表有环,快、慢指针一定会相遇指向同一个节点(可理解为环型跑道速度快的一定可追上速度慢的),则返回true;如果链表无环,遍历完整个链表,返回false。
C语言实现:
bool hasCycle(struct ListNode* head ) {
struct ListNode *p,*q;
p=q=head;
while(q&&q->next){
p=p->next;//慢指针p每次走一步
q=q->next;
q=q->next;//快指针q走两步
if(q&&q->val==p->val) return true;//有环
}
return false;//无环
}