4.如何判断单向链表是否有环?已知有环的情况下如何找到环的起始节点?要求时间o(N),空间o(1).
设定两个指针p,q,p每次向前移动一步,q每次向前移动两步。如果单向链有环,则p会与q相遇;否则,q会遇到NULL。
int isExistLoop(node *head)
{
node * slow,fast;
slow = head;
fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
return 1;
}
return 0;
}
在上一步得到的相遇点处设一指针,在链表头设一指针,继续单步移动,两指针第一次的相遇点便是环的入口点。
node * get_node_ofcircle(node *head)
{
node * slow,fast;
slow = head;
fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
break;
}
fast = head;
while(slow != fast)
{
slow = slow->next;
fast = slow->next;
}
return slow;
}