leetcode每日一练-第141题-环形链表

leetcode每日一练-第141题-环形链表_第1张图片

一、思路

双指针

二、解题方法

使用了正确的快慢环指针方法来判断链表。快指针每次向前移动两步,慢指针每次移动一步,如果链表中向前移动一步,它们最终会相遇。如果链表不存在环,快指针会先到达链表是否存在,此时存在我们就可以判断链表没有环。同时,增加了我们对空链表的处理,避免了空指针访问。

 

三、code

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head || !head->next)
        {
            return false;// 空链表或只有一个节点的链表一定没有环
        }
        ListNode* fast=head;
        ListNode* slow=head;

        while(fast && fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast == slow)
            {
                return true;// 快慢指针相遇,说明链表有环
            }
        }
        return false;// 快指针到达链表末尾,没有环
        
    }
};

=========================================================================学到的知识:

① while(fast && fast->next)里的 fast->next

如果没有这样的条件判断,当快指针已经到达链表结束时,再进行的访问操作会导致空指针引用,造成程序崩溃fast->next 

if(fast == slow)为什么不是if(fast->val == slow->val)

当链表中有环时,快指针和慢指针相遇。换句话说,两个指针都指向循环中的同一个节点。fast->val检查这些节点(和)的值slow->val并不能保证指针由于循环而相遇。可能存在值相同但不存在循环的其他情况。

你可能感兴趣的:(c++)