Given a linked list, determine if it has a cycle in it.
Follow up:
Follow up:
Can you solve it without using extra space?
问题分析:判断一个单链表是否存在环,要求不使用额外的空间。刚开始对着题目发了半天呆,想着如果用循环,如果存在环就是死循环,后来想想是不是有什么策略来在循环过程中判断是否存在环然后退出,这样就避免了死循环。具体做法就是每访问一个节点,就将这个节点的值设置为NULL,然后不断去判断next节点所指的值,如果存在环,则在循环的过程中,肯定最后一个节点的下一个节点就会是之前被访问过并且值被设置为NULL的节点,这种情况出现了,return返回就好了,如果不存在那种情况,就不存在环,也就不存在死循环了。代码很简单,如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL) return false;
ListNode *p=head;
while(p->next){
if(p->next->val==NULL) return true;
p->val=NULL;
p=p->next;
}
return false;
}
};