【C语言】判断单链表是否带环

思想:快慢指针,若为环,则快指针一定能追上慢指针

intIsCycle(Plinklist*pplist)
{
          assert(pplist);
          Node*fast = *pplist;
          Node*slow = *pplist;
          while(fast&&fast->next)
          {
                   fast = fast->next->next;
                   slow = slow->next;
                   if(fast == slow)
                   {
                             return1;
                   }
          }
          return0;
}
判断单链表是否循环是一种常见的算法问题,在C语言中可以使用“快慢指针法”来解决。 ### 解决思路 我们可以通过两个指针分别从头节点出发,其中一个每次移动一步(称为慢指针),另一个每次移动两步(称为快指针)。如果链表存在环,则这两个指针最终会相遇;若不存在环,则快指针将到达链表的末尾(NULL)。 以下是具体的实现步骤: 1. 初始化两个指针 `slow` 和 `fast` 指向链表头部。 2. 遍历链表,`slow` 移动一次,而 `fast` 每次移动两次。 3. 如果在遍历过程中 `fast` 或者 `fast->next` 变为空,则说明链表无环并退出检查。 4. 若两者在某一时刻指向了相同的结点,表明该链表有环,并返回 true 表示检测到环。 ```c #include <stdio.h> #include <stdbool.h> typedef struct Node { int data; struct Node* next; } Node; bool hasCycle(Node *head) { if (head == NULL || head->next == NULL) return false; // 空列表或只有一个节点不可能成环 Node *slow = head; Node *fast = head; while(fast != NULL && fast->next != NULL){ slow = slow->next; // 慢指针走一步 fast = fast->next->next; // 快指针走两步 if(slow == fast){ // 相遇则表示存在环路 return true; } } return false; // 走到底都没有相遇则没有环路 } ``` 上面展示了如何用 C 实现检测单链表是否有环的功能。通过引入快慢双指针的方式,可以在 O(n) 的时间复杂度内完成整个操作,同时空间复杂度仅为常数级 O(1),非常高效实用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值