为什么用快慢指针找链表的环,快指针和慢指针一定会相遇?

      这个问题你可以用数学归纳法来思考。首先,由于链表是个环,所以相遇的过程可以看作是快指针从后边追赶慢指针的过程。那么做如下思考:
1:快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。
2:快指针与慢指针之间差两步。此时唏嘘往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。
3:快指针与慢指针之间差N步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差(N+1-2)-> N-1步。

因此,此题得证。所以快指针必然与慢指针相遇。又因为快指针速度是慢指针的两倍,所以相遇时必然只绕了一圈。


作者:知乎用户
链接:https://www.zhihu.com/question/23208893/answer/117115415
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
判断链表是否有,可以使用快慢指针的方法。具体来说,可以用两个指针,一个指针每次向前移动1个节点,另一个指针每次向前移动2个节点。如果存在,那么这两个指针最终一定相遇。 以下是详细的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> // 链表节点结构体 struct ListNode { int val; struct ListNode *next; }; // 判断链表是否有 bool hasCycle(struct ListNode *head) { if (head == NULL) { return false; } struct ListNode *slow = head; struct ListNode *fast = head->next; while (fast != NULL && fast->next != NULL) { if (slow == fast) { return true; } slow = slow->next; fast = fast->next->next; } return false; } int main() { // 创建链表 struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); head->val = 1; head->next = NULL; struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode)); node1->val = 2; head->next = node1; struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode)); node2->val = 3; node1->next = node2; struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode)); node3->val = 4; node2->next = node3; // 构造 node3->next = node1; // 判断链表是否有 if (hasCycle(head)) { printf("链表\n"); } else { printf("链表\n"); } return 0; } ``` 在上面的代码中,我们先创建了一个包含4个节点的链表,并构造了一个。然后使用`hasCycle()`函数判断链表是否有,最终输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值