解决思路:常规做法就是利用辅助数据来记录遍历的节点,如果当前遍历的节点在辅助空间中存在即存在循环链表,否则没有存在循环链表。但是需要空间比较大。
这里思路是用两个节点不同速度去遍历,一个走两步,一个走一步,在遍历不为空的情况下如果某次 相遇则是回环链表。
代码如下:
/**
* 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* temp1=head;
ListNode* temp2=head;
//先判断是否为循环链表,如果不是直接返回false,快慢每一步做比较
while(temp2&&temp2->next){
if((temp1->next!=NULL)&&(temp2->next->next!=NULL)){
temp2=temp2->next->next;
temp1=temp1->next;
}
else return false;
if(temp2==temp1){
return true;
}
}
return false;
}
};