您的位置:首页 > 其它

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

2017-07-17 00:09 417 查看
比较简单直接贴代码:

#pragma once
//先定义一个链表结构体
typedef int TypeData;
typedef struct NodeList
{
NodeList* _next;
TypeData _data;
}NodeList;

//判断链表是否带环 时间复杂度为O(n)
bool ListCircle(NodeList* list1)
{

NodeList* slow = list1;
NodeList* fast = list1;
while (fast && fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
if (fast == slow)
break;
}

return !(fast == NULL || fast->_next == NULL);

}

//若带环,求环的入口点    时间复杂度为O(n)
NodeList*  CirclePort(NodeList* list1)
{
NodeList* slow = list1;
NodeList* fast = list1;
while (fast && fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
if (fast == slow)
break;
}
if (fast == NULL || fast->_next == NULL)
return NULL;
//走到这个位置fast就是快慢指针相遇点
slow = list1;
while (slow != fast)
{
slow = slow->_next;
fast = fast->_next;
}
return slow;

}

//若带环求环的长度,时间复杂度为O(n)
int LengthCircle(NodeList* list1)
{
NodeList* slow = list1;
NodeList* fast = list1;
int count = 0;
while (fast && fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
if (fast == slow)
break;
}
if (fast == NULL || fast->_next == NULL)
return NULL;
//走到这个位置fast就是快慢指针相遇点
NodeList* cur = fast;
do
{
count++;
cur = cur->_next;
} while (cur != fast);
return count;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐