算法思路:考虑使用快慢双指针。慢指针每次走一步,快指针每次走两步,如果链表有环,快、慢指针一定会相遇指向同一个节点(可理解为环型跑道速度快的一定可追上速度慢的),则返回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;//无环

}