原题链接:https://leetcode.cn/problems/linked-list-cycle/description/
目录
1. 题目描述
2. 思路分析
3. 代码实现
1. 题目描述
2. 思路分析
整体思路:定义快慢指针fast,slow,如果链表确实有环,fast指针一定会在环内追上slow指针。
即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。
我们简化一下这个问题,用一个线段表示前面的不带环部分的链表,用一个圆圈表示带环部分的链表 。
slow一次走1步,fast一次走2步,一定能追上吗?(这里的走的步数可以理解成跳格子)
一定可以追上!
当slow进环以后,fast开始追及slow,假设入环时,它们之间的距离是N。每追及1次,它们之间的距离缩小1。当它们之间的距离为0时,就追上了。
扩展:
slow一次走1步,fast一次走3步,一定能追上吗?
当slow进环以后,fast开始追及slow,假设入环时,它们之间的距离是M。每追及1次,它们之间的距离缩小2。我们假设环的周长是C,这时我们就要分类讨论了:
由此我们可以知道,得看距离M和环的周长C的大小来具体情况具体分析!
那么如果slow一次走1步,fast一次走4步呢?
当slow进环以后,fast开始追及slow,假设入环时,它们之间的距离是K。每追及1次,它们之间的距离缩小3。我们假设环的周长是C,这时我们就要分类讨论了:
由此我们可以知道,得看距离K和环的周长C的大小来具体情况具体分析!文章来源:https://www.toymoban.com/news/detail-662447.html
3. 代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode *fast=head,*slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
return true;
}
return false;
}
文章来源地址https://www.toymoban.com/news/detail-662447.html
到了这里,关于【数据结构OJ题】环形链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!