元のタイトルのリンク: https://leetcode.cn/problems/linked-list-cycle/description/
目次
1. トピックの説明
2.思考分析
全体的な考え方:高速ポインタと低速ポインタを定義するfast と throw .リンクされたリストにリングがある場合、高速ポインタはリング内の低速ポインタに追いつきます。
つまり、低速ポインタは一度に 1 ステップずつ移動し、高速ポインタは一度に 2 ステップずつ移動します。2 つのポインタは、リンク リストの開始位置から実行を開始します。リンク リストにリングがある場合、それらは確実に実行されます。そうでない場合、高速ポインタは最初にリンクされたリストの最後に移動します。
この問題を単純化して、前にリング部分がないリンク リストを線分で表し、リング部分があるリンク リストを円で表すことにします。
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;
}