如何判断单链表里面是否有环

来源:互联网 发布:手机系统分身软件 编辑:程序博客网 时间:2024/05/18 06:28
定义两个指针p、q,然后让p、q同时从链表头向后查找,注意他们移动的步幅是不同的分别为a

、b,例如p指针每次执行一次【p = p->next;】q每次执行两次【q = q->next;】,如果q先到链尾【if(q->next == NULL)】则没有死循环(这里假设q比p的移动速度要快),如果p、q在此之前相遇了则有死环。

实现的函数如下:

bool   CircleInList(Link*   pHead) { if(pHead   ==   NULL   ||   pHead-> next   ==   NULL)//无节点或只有一个节点并且无自环 { return   (false); } if(pHead-> next   ==   pHead)//自环 { return   (true); } Link   *pTemp1   =   pHead;//step   1 Link   *pTemp   =   pHead-> next;//step   2 while(pTemp   !=   pTemp1   &&   pTemp   !=   NULL   &&   pTemp-> next   !=   NULL) { pTemp1   =   pTemp1-> next; pTemp   =   pTemp-> next-> next; } if(pTemp   ==   pTemp1) { return   (true); } return   (false); }