您的位置:首页 > 职场人生

浅析有关链表的带环问题

2017-07-16 12:25 218 查看
概要:

有关链表带环问题的面试题:

*判断一个链表是否带环?

*求环的长度?

*求环的入口点?

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 面试题