嵌入式技术
如何判断链表是否有环?
首先,有环的链表应该长这样。
正常的单向链表最后一个结点的指针域应该是NULL,表示后面没有结点。
但是如果把它改成前面某个结点的地址,就会变成这个样子,这样的链表就叫有环的链表。

如何判断链表是否有环,其中一个比较常见的方法就是,两个指针,经常把他们称作快慢指针,慢的指针每次走一步,快的指针每次走两步,如果链表没环,快的指针肯定最先达到终点;如果链表有环,那么两个指针迟早相遇。
代码也极其简单:
int is_cross(Node *head)
{
if (NULL == head)
return 0;
Node *fast = head;
Node *slow = head;
while (fast && slow)
{
if (fast->next && fast->next->next)
fast = fast->next->next;
else
break;
if (slow->next)
slow = slow->next;
else
break;
if (fast == slow)
return 1;
}
return 0;
}

当快指针和慢指针相遇的时候,再定义一个指针指开头。该指针和慢指针同时向后走。两个指针相遇的时候,就是环开始的结点。
int is_cross(Node *head)
{
if (NULL == head)
return 0;
Node *fast = head;
Node *slow = head;
while (fast && slow)
{
if (fast->next && fast->next->next)
fast = fast->next->next;
else
break;
if (slow->next)
slow = slow->next;
else
break;
if (fast == slow)
{
Node *p = head;
while (p != slow)
{
p = p->next;
slow = slow->next;
if (p == slow)
{
/*环开始的结点*/
}
}
}
}
return 0;
}
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !