链表中的环

Posted Lunais

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表中的环相关的知识,希望对你有一定的参考价值。

判断链表是否有环,定义指针一快(走2部)一慢(走1部),相遇即有环。

bool isCircle(listNode* head){
        if(NULL == head)
           return false;
        listNode* slowNode = head->next;
        if(NULL == slowNode)
           return false;
        listNode* fastNode = head->next;
        while(fast != NULL && slow != NULL){
                 if(fast == slow)
                    return true;
                 
                 slowNode = slowNode->next;
                 fastNode = fastNode->next;
                 if(fastNode != NULL)                   //快指针时刻检查,是否为空
                    fastNode = fastNode->next;
        }
        return false;  
}

两个指针,一快一慢,有环,则相遇必在环内,找出相遇节点

listNode* meetingNode(listNode* head){
        if(NULL == head)
           return NULL;
        listNode* slowNode = head->next;
        if(NULL == slowNode)
           return NULL;
        listNode* fastNode = head->next;
        while(fast != NULL && slow != NULL){
                 if(fast == slow)
                    return fast;
                 
                 slowNode = slowNode->next;
                 fastNode = fastNode->next;
                 if(fastNode != NULL)                   //快指针时刻检查,是否为空
                    fastNode = fastNode->next;
        }
        return NULL;  
}

接下来,就可以统计环中节点个数,找出环的入口节点

设节点个数为n,快指针先走n步,然后快慢指针一起一步一步走,相遇节点即环入口节点。

 

以上是关于链表中的环的主要内容,如果未能解决你的问题,请参考以下文章

求链表中的环的入口点

链表中的环入口节点

链表中的环

快慢指针找链表中的环

快慢指针找链表中的环

LeetCode:环形链表