概要:
有关链表带环问题的面试题:
*判断一个链表是否带环?
*求环的长度?
*求环的入口点?
1、判断链表是否带环?
//判断一个链表是否带环
//思路:快慢指针,返回相遇点
Node* IsCircle(Node* head)
{
if (head == NULL)
{
return NULL;
}
Node* pFast = head;
Node* pSlow = head;
//快指针一次走两步,慢指针一次走一步
while (pFast && pFast->_next)
{
pFast = pFast->_next->_next;
pSlow = pSlow->_next;
if (pFast == pSlow)
{
break;
}
}
if (pFast && pFast->_next)
{
return pFast;
}
return NULL;
}
2、求环的长度?
若带环,求环的长度?
从相遇点的下一个节点开始遍历链表,每走一步统计一次,直到遇到相遇点就停止,统计的次数就是环的长度。
需要注意的是:因为是从相遇点的下一个节点开始遍历,所以计数器的初始值需要给1.
size_t lengthOfCircle(Node* meetNode)
{
assert(meetNode);
size_t count = 1;//注意初始值
Node* cur = meetNode->_next;
while (cur != meetNode)
{
count++;
cur = cur->_next;
}
return count;
}
3、求环的入口点?
Node* GetEntryNode(Node* head, Node* meetNode)
{
assert(head && meetNode);
Node* p1 = head;
Node* p2 = meetNode;
while (p1 != p2)
{
p1 = p1->_next;
p2 = p2->_next;
}
return p1;
}