若单向链表存在环那么链表的形态为
有环的链表简单的遍历走不到尾
那么我们怎么判断有环呢?环就像是操场的的跑到 那么运动天赋一向不太好的 我很容易就能想到跑步时容易让人扣圈
同理 我们可以定义两个指针让他们同时指向链表的头 一个指针一次走两步 一个指针一次走一步 那么如果链表有环那么他们一定会在环内的某一点相遇 假如这一点就为环内标号为K的点,这时我们让一个指针不动,一个指针继续向后走 一次走一步 这样等到连个指针再次相遇的时候我们就可以求出环的长度为N,既然我们已经知道了环的长度 那么我们就可以求出环的入口位置
我们定义两个指针指向链表的头结点 让一个指针先走N 步 然后再让两个指针同时走那么当两个指针相遇的时候就是这个环的入口位置
判断是否有环
typedef struct node{
char data ;
node * next ;
}Node;
bool exitLoop(Node *head)
{
Node *fast, *slow ;
slow = fast = head ;
while (slow != NULL && fast -> next != NULL)
{
slow = slow -> next ;
fast = fast -> next -> next ;
if (slow == fast)
return true ;
}
return false ;
}
找到环的入口节点