题目:
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
思路:这道题的意思是,给定一个链表,要你判断它是否包含一个环。一开始我理解错了题意,以为是要判断给定的链表是否构成环,所以一看到题目,
马上想到直接用两个指针s,p指向头结点,s不断往后移动,如果重新移动到p的位置就说明构成环...于是提交上去自然是错了~~
正确的题意是判断链表中是否包含环,所以有可能如下图这种情况:
所以正确的思路是,设置s,p两个指针指向头结点,s每次往后移动两步,p每次往后移动1步。如果s和p相遇了,就证明链表中有环,否则无环。
通过代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *p=head,*s=head;
while(s!=NULL&&s->next!=NULL&&p!=NULL) //p!=NULL这个条件可以省略,s!=NULL容易被忽略,如果省掉会报runtime error(对空指针进行了引用)
{
s=s->next->next;
p=p->next;
if(s==p)return true;
}
return false;
}
};
这个题目如果判断条件或者其他地方写的太繁琐,会容易超时。