欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章
题目:环形链表
思路解析
经典的Floyd判圈算法(龟兔赛跑算法),用于检测单链表中是否存在环。
-
算法核心思想:
- 使用两个指针,
slow(慢指针/乌龟)和fast(快指针/兔子),同时从链表头部出发。 slow指针每次移动一步,fast指针每次移动两步。- 如果链表中存在环,那么快指针最终一定会追上慢指针(两者指向同一个节点);如果不存在环,快指针会先到达链表尾部(指向
NULL)。
- 使用两个指针,
-
逻辑拆解:
- 初始化:两个指针都指向链表头节点
head。 - 循环条件:
fast != NULL && fast->next != NULL,确保快指针不会访问空指针的成员,避免程序崩溃。 - 指针移动:慢指针走一步,快指针走两步。
- 环检测:如果快慢指针相遇(
slow == fast),说明链表有环,返回true;否则循环结束后返回false。
- 初始化:两个指针都指向链表头节点
流程图
代码
bool hasCycle(struct ListNode *head)
{
typedef struct ListNode ListNode;
ListNode* fast = head;
ListNode* slow = head;
while(fast!=NULL && fast->next!= NULL)
{
fast = fast->next->next;
slow = slow->next;
if(slow == fast)
{
return true;
}
}
return false;
}
总结
- 核心算法:Floyd判圈算法(龟兔赛跑),通过快慢指针的追击问题检测链表环。
- 时间复杂度:O(n),每个节点最多被访问两次(慢指针遍历一次,快指针最多遍历两次)。
- 空间复杂度:O(1),仅使用了两个指针的额外空间,是原地算法。
- 本节完…

825

被折叠的 条评论
为什么被折叠?



