Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Follow up:Can you solve it without using extra space?
分析
题意是:给定一个链表,检查这个链表是否有环。Tips:不使用额外空间解决
判断链表是否有环,使用快慢指针来实现
设置1快1慢两个指针,快指针一次走两步,慢指针一次走一步
- 如果快慢指针遇到NULL,那么链表肯定是没有环的
- 链表中有环,那么会出现快指针和慢指针指向一个节点的时候
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/*
* 判断链表是否有环,使用快慢指针来实现
* 设置1快1慢两个指针,快指针一次走两步,慢指针一次走一步
* 1)如果快慢指针遇到NULL,那么链表肯定是没有环的
* 2)链表中有环,那么会出现快指针和慢指针指向一个节点的时候
*/
bool hasCycle(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if( !head )
return false;
ListNode *slower = head;
ListNode *faster = head;
while( slower && faster )
{
slower = slower->next;
if (faster->next != NULL)
faster = faster->next->next;
else // 快指针到了NULL,链表肯定没环
return false;
if(slower == faster) // 快指针反超慢指针,快慢指针都指向一个节点,有环。
return true;
}
// 判断一下推出while循环的条件
if(slower != NULL && slower == faster)
return true;
return false;
}
};