个人方法:
快慢指针:
/**
* 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) {
ListNode *p1=head;
ListNode *p2=head;
if(p2==nullptr||p2->next==nullptr)//考虑head为nullptr的情况
return false;
p2=p2->next;
while(p1!=p2)
{
p1=p1->next;
if(p2->next==nullptr)
return false;
p2=p2->next;
if(p2->next==nullptr)
return false;
p2=p2->next;
}
return true;
}
};
if(p2nullptr || p2->nextnullptr)//考虑head为nullptr的情况
这句代码要需要注意要将p2nullptr的判断放在||的左边,若p2nullptr为1则不在进行下一步判断直接进入if语句。反之,若将
p2->next==nullptr放在左边,会导致在链表为空时出现nullptr->next的错误情况,导致程序出错。
while中内容可进行简化
/**
* 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) {
ListNode *p1=head;
ListNode *p2=head;
if(p2==nullptr||p2->next==nullptr)//考虑head为nullptr的情况
return false;
p2=p2->next;
while(p1!=p2)
{
p1=p1->next;
if(p2->next==nullptr||p2->next->next==nullptr)
return false;
p2=p2->next->next;
}
return true;
}
};
编程小萌新个人总结,欢迎各位大佬批评指正。