给定一个链表,判断链表中是否有环。考虑各种情况。表为无头结点、单向。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)

//第一次尝试:
//方法:快慢指针,设置两个指针fast、slow,两个指针都从链表头结点开始遍历,fast一次走两步,slow一次走一步,如果链表有环,那么一定有slow==fast
// 原因:如果存在环,fast先进入环内,等到slow进入环的时候,不管fast处于环的什么位置,slow走完环的一圈,fast走完环的两圈,那么fast一定会和slow相遇
// 如果fast一次走三步、四步等等,那么在极端情况下,fast、slow将有可能永不相遇
bool
hasCycle(struct ListNode* head) { if(head == NULL){ return false; }
//创建快慢指针
struct ListNode* fast = head; struct ListNode* slow = head;
//循环遍历,fast一次两步,slow一次一步
while(fast != NULL&&fast->next != NULL){ fast = fast->next->next; slow = slow->next;
//如果fast和slow相遇则有环,返回true
if(slow == fast){ return true; } }
//如果上面的循环没有结束函数,则说明没环,返回false
return false; }