Description:
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
描述:
给定一个链表,写一个函数确定这个链表是否有环。空间复杂度为O(1)
思路:
链表有环,则最后一个节点的next指针会指向前面任意一个节点,如果空间复杂度不作要求的话,那么这个题会非常简单,但是题目要求空间复杂度为O(1),那我们就不能使用额外的数据结构来帮助我们解决这个问题。
我们可以想像两个人跑步,一个跑得慢,一个跑得快,
如果他们沿直线跑,那么在有限时间内,他们两个必然不会相遇。
如果他们绕圈跑,那么跑得快的那个人肯定会从后面追上跑得慢的那个人。
这样就提供了解题的思路:
我们需要两个指针,一个指针每次只走一个节点,另外一个指针每次走两个节点,那么必然在某个时候,这两个指针会指向同一个节点,那么这个链表就必然存在环。
所以我们就可以得到下面的代码:
bool hasCycle(ListNode *head) {
if (head == nullptr) {
return false;
}
ListNode* walker = head;
ListNode* runner = head;
while (runner->next != nullptr && runner->next->next != nullptr) {
walker = walker->next;
runner = runner->next->next;
if (walker == runner) {
return true;
}
}
return false;
}