LeetCode#141环形链表
题目链接
一道链表问题,通俗来说就是判断一个链表中是否有环力扣的翻译真绝了,除了开辟额外,如使用哈希表等等,还有其他的方式吗?那为了不开辟额外的空间,我们需要引入一个新的指针方式:快慢指针。
顾名思义,快慢指针就是两个指针,一个跑的快,一个跑得慢,它是在链表中检测是否有环的一个重要方式,具体实现方式是:声明两个指针,接下来进行循环,快指针每次步进两下,慢指针每次步进一下,如果遇到空指针那么肯定是找到了链表结尾,没有环,而如果快指针最终追上了慢指针(两个指针相遇),那么就一定是在链表中存在环。具体原理可以使用严谨的数学公式进行推导…而使用的话,我们只需要类比在操场跑圈即可:如果都围着操场跑步,那么跑得快的同学总会有追上跑的慢的同学的时候(扣圈),但是如果在直道上,跑步速度不同的两个同学是永远不会相遇的。
附代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Solution { public: bool hasCycle(ListNode *head) { if(head == nullptr || head -> next == nullptr) return false; ListNode* fast = head -> next; ListNode* slow = head; while(fast != slow) { if(fast -> next == nullptr || fast -> next -> next == nullptr || slow -> next == nullptr) return false; fast = fast -> next -> next; slow = slow -> next; } return true; } };
|