先上代码
bool hasCycle(struct ListNode *head) {
struct ListNode *slow = head,*fast = head;
while(fast && fast -> next)
{
slow = slow -> next;
fast = fast -> next -> next;
if(slow == fast)
return true;
}
return false;
}
本题要求写出代码判断该链表是否是环形链表,所以我将使用快慢指针来解题
思路:快慢指针,fast指针的速度是slow指针的两倍,所以fast指针一定会先到达链表的后方,然后进入环形继续运行。如果该链表是环形链表,那么fast就一定能追上slow,所以写出判断当slow=fast时就可以证明这是一个环形链表,否则当fast或fast->next到尽头时循环结束,输出false
注意:此处fast步长应为slow的2倍,否则可能会跳过slow继续循环;
假设二者都进入环形时相距为n,那么当slow前进1步则fast前进2步,二者之间的距离为n-1,循环下去就有n-2,n-3,n-4......直到fast追上slow