判断单链表是否带环?若带环,求环的长度?求环的入口点?

来源:互联网 发布:linux ftp访问目录 编辑:程序博客网 时间:2024/06/05 07:48

第一步:判断是否带环

ListNode* IsCycle(ListNode* list)//快慢指针法{    List* fast=list,* slow=list;    while(fast&&fast->next)    {        slow=slow->next;        fast=fast->next->next;        if(fast==slow)        {            return slow;        }        return NULL;    }}思路:快慢指针法慢指针一次走一步,快指针一次走两步,如果两个指针相遇则说明有环,返回相遇点;否则无环返回NULL

第二步:若带环,求环的长度

int lengthCycle(ListNode* list){    ListNode* meet=IsCycle(list);    if(meet)    {        int count=1;        ListNode* tmp=meet->next;        while(tmp!=meet)        {            tmp=tmp->next;            count++;        }        return count;    }}思路:从相遇点开始走,遍历环,再一次回到相遇点所走的距离即为环的长度

第三步:求环的入口点

ListNode* Enter(ListNode* list){    ListNode* meet=IsCycle(list);    if(meet)    {        while(meet!=list)        {            meet=meet->next;            list=list->next;        }        return list;    }    return NULL;}

这里写图片描述

阅读全文
0 0