力扣上做的一道关于双指针的练习题目
要解决的问题:找出给定的一个链表是否有环
解决思路:快指针和慢指针(双指针)
步骤分析:(while循环语句)
(1)创建指向头节点的两个指针,快指针和慢指针
(2)设置条件:快指针不为空并且指向的后继也不能为空
(3)有环条件:快指针和满指针相遇
自己写的代码执行出错
分析原因:使用了if ----else语句操作返回值,程序出错。因为值返回了一个值,如果条件不满足将不会有返回值,所以出错
解决:需要再加一个返回值。
错误代码
class Solution {
public:
bool hasCycle(ListNode head) {
//创建快慢指针
ListNodeslowptr=head;//指向头节点
ListNode*fastptr=head;//指向头节点
//条件:快指针本身不能为空,并且指向不能为空
while(fastptr!=NULL&&fastptr->next!=NULL)
{
slowptr=slowptr->next;
fastptr=fastptr->next->next;
//判断节点是否重合
if(slowptr==fastptr)
{
return true;
}
else
{
return false;
}
}
}
};
正确代码
class Solution {
public:
bool hasCycle(ListNode head) {
ListNode fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
// 快慢指针相遇,说明有环
if (slow == fast) return true;
}
return false;
}
};
参考:https://leetcode-cn.com/problems/linked-list-cycle/comments/