#include <stdbool.h>
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param head ListNode类
* @return bool布尔型
*/
bool hasCycle(struct ListNode* head ) {
// write code here
struct ListNode *p = NULL;
struct ListNode *pp = NULL;
//空链表的判断
if(head == NULL)
{
return false;
}
p = pp =head;
while( pp->next != NULL && pp->next->next != NULL)
{
//pp移动的末尾出现NULL时表示没有环
pp = pp->next->next;
p = p->next;
if(p == pp)
{
p = NULL;
pp = NULL;
return true;
}
}
p = NULL;
pp = NULL;
return false;
}
代码的关键在对链表的安全处理:
1、单链表为空的时候,对head节点进行判断
2、链表指针的判断,当使用快慢指针的时候,在无环的情况下需要对快指针进行范围的判断
快指针的的下一个指向NULL的时候表示遍历结束,没有环,所以需要对快指针的下一个节点以及下下个节点进行判断,以免出现段错误
判断单链表是否有环
最新推荐文章于 2022-09-26 17:37:08 发布