美文网首页
142. Linked List Cycle II

142. Linked List Cycle II

作者: larrymusk | 来源:发表于2017-11-20 20:25 被阅读0次

首先判断是否存在环,如果是把slow移动到头结点,开始和fast同步向后移动,如果相等就返回。

注意对于最后slow == fast的判断,需要放在循环入口处,否则对于如下case失效:

        if(slow == fast)
            return fast;


[1,2]
tail connects to node index 0

第一次检查cycle时候 fast == slow == 1

接下来循环入口如果不判断,之后两个会在[2]判断相等并返回[2]作为cycle的头结点,明显是不对的。

struct ListNode *detectCycle(struct ListNode *head) {
    if(head == NULL)
        return NULL;

    struct ListNode *slow , *fast;
    fast = slow = head;
    while(fast){
            fast = fast->next;

        if(fast){
            fast= fast->next;
            slow = slow->next;
        }

        if(slow == fast){
            printf("have cycle\n");
            break;
        }
    }
    
    if(fast == NULL)
        return NULL;

    slow = head;

    while(1){


        if(slow == fast)
            return fast;
        slow = slow->next;
        fast = fast->next;
    }
    
}

相关文章

网友评论

      本文标题:142. Linked List Cycle II

      本文链接:https://www.haomeiwen.com/subject/qgdbvxtx.html