快慢指针检测单链表环时无环场景末尾printf未输出是什么原因
问题根因与修复方案
核心错误原因
你代码的问题出在while循环的判断条件上:
- 你使用了
||(逻辑或)作为判断运算符,逻辑或的规则是只要任意一个条件成立就进入循环。当链表无环时,快指针Fast最终会走到链表末尾变为NULL,此时第一个判断Fast != NULL不成立,程序会继续判断第二个条件Fast->next != NULL,访问空指针的成员会直接触发段错误,进程被系统终止,自然执行不到循环后的printf语句。 - 正确的判断条件应该用
&&(逻辑与):只有Fast本身不为空,且Fast的下一个节点也不为空时,才能保证Fast->next->next的访问是合法的,不会出现空指针访问。
额外优化建议
你当前的printf语句没有加换行符\n,在多数终端环境下标准输出是行缓冲模式,没有换行符时内容可能不会被主动刷新到终端上,即使程序正常执行到打印逻辑也可能看不到输出,建议给所有printf的字符串末尾加上\n。
修复后的完整代码
// 检测单链表是否存在环,使用快指针(步长2)慢指针(步长1)方案 void DetactLoop(struct Node **head) { struct Node *Fast = *head; struct Node *Slow = *head; if (Fast == NULL) { printf("Head is NULL\n"); return; } // 把 || 改为 && while (Fast != NULL && Fast->next != NULL) { Fast = Fast->next->next; Slow = Slow->next; if (Fast == Slow) { printf("Loop detected!\n"); return; } } printf("No Loop found!\n"); }
内容的提问来源于stack exchange,提问作者roshannepal_x
相关产品推荐
相关产品推荐

