目录
链表是否成环
题目描述:
给你一个链表的头节点
head
,判断链表中是否有环。如果链表中存在环 ,则返回true
。 否则,返回false
。
输出:true
输出:false
解题思路:首先定义两个快慢指针,从头节点开始出发,快指针每次走两步,慢指针每次走一步,当快指针进入环后,慢指针走了进入环之前的1/2路程,当慢指针进入环后,开始追赶模式。快指针追赶慢指针。当快指针和慢指针指向同一位置时,表示有环产生。画图分析:
代码如下:
bool hasCycle(struct ListNode *head)
{
struct ListNode * fast;
struct ListNode * slow;
fast = head;
slow = head;
while (fast && fast->next )
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow )
{
return true;
}
}
return false;
}
快指针能否追赶上慢指针
①、slow一次走一步,fast一次走2步,一定能追上吗?一定能
②、slow一次走一步,fast一次走3步,能追上吗?fast一次走4步呢?n步呢? 不一定,特殊场景下可能永远追不到
类似情况和上边分析过程一样!!!
求链表环的入口点
代码实现:
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *slow = head,*fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(fast == slow)
{
struct ListNode *meet = slow;
while(meet != head)
{
meet = meet->next;
head = head->next;
}
return meet;
}
}
return NULL;
}