Leetcode检测链表是否有环的问题中遇到这个问题,开始的时候是我把链表理解错误,初始化快慢指针的时候,是将头结点赋值给新建指针,即新建快慢指针是与头指针一样指向第一个数,而非是指向头结点(初学导致理解错误),这样分析一下代码就能修改正确了。
开始写的代码如下:
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL)
return false;
ListNode* fast = head;
ListNode* slow = head;
// cout << fast->val << endl;
while (slow != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
return true;
}
return false;
}
};
是在测试案例 [1, 2] 不存在环 这一情况下运行时报错,在正确理解上述快慢指针初始化问题之后,分析如下:
1、开始初始化 fast、slow 均指向 1 ;
2、第一次循环条件判断 slow 指向1 != NULL fast->next 指向 2 != NULL,满足条件,指针自然进行平移;
3、此时slow指向了节点2 ,而fast指向了尾结点 为 NULL;
4、第二轮循环时 fast->next 空指针是没有next的,自然会报错。
即也要考虑到fast本身是否为NULL和其下一节点是否为NULL。
测试通过的代码:
我敲了cout,看到初始的快慢指针指向的节点的值才反应过来......
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL)
return false;
ListNode* fast = head;
ListNode* slow = head;
// cout << fast->val << endl;
while (slow != NULL && fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
return true;
}
return false;
}
};