Skip to content

Commit e5ede53

Browse files
committed
docs(algorithm): update header hierarchy and single-node cycle edge case explanations for Linked List Cycle
1 parent 3065cc9 commit e5ede53

4 files changed

Lines changed: 10 additions & 10 deletions

File tree

Algorithm/Floyds-Tortoise-and-Hare/leetcode/141. Linked List Cycle/Claude Sonnet5/Linked_List_Cycle_Python.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@
66
>
77
> **CPython特有の注意点**:この問題は一見「訪問済みノードを`set`に記録すればいい」と思いがちですが、それだと空間計算量がO(n)になります。CPythonでは`set`への追加・検索自体はハッシュテーブル(=値を高速に検索できる索引付きの箱)によりO(1)と高速ですが、ノード数が10万件を超えるような大規模な入力では、メモリ使用量が問題になります。今回はメモリを一切増やさない「2つのポインタ(変数)だけ」で解く方法を採用します。
88
9-
#### 競技プログラミング視点
9+
### 競技プログラミング視点
1010

1111
- **制約分析**: ノード数は最大`10^4`(=1万)件程度が想定されるため、O(n)のアルゴリズムであれば十分高速に処理できます。
1212
- **最速手法**: Floyd's Tortoise and Hare(亀と兎のアルゴリズム)を使えば、リストを1回走査するだけで判定でき、Big-O的にもPython実装的にも最適です。
1313
- **メモリ最小化**: 追加のデータ構造(`set``list`)を一切使わず、ポインタ変数2つだけで実装することでO(1)の空間計算量を実現します。
1414
- **CPython最適化**: `while`ループ内での属性アクセス(`.next`)はPure Python(=C言語ではなくPythonコードそのもので実行される処理)のため多少のオーバーヘッドはありますが、これ以上シンプルにする手段はなく、これが最速の実装です。
1515

16-
#### 業務開発視点
16+
### 業務開発視点
1717

1818
- **型安全設計**: `Optional[ListNode]`という型ヒントを使い、「ノードが存在しない(`None`)かもしれない」ことを明示します。これによりpylanceが「`None`かもしれない変数に`.next`でアクセスしようとしている」といった潜在バグを実行前に検出できます。
1919
- **エラーハンドリング**: リンクリストの循環検出という問題の性質上、入力そのものが不正(型が違う等)になるケースは少ないですが、`head``None`の場合の早期リターンなど、境界条件(=入力の端っこのパターン)を明示的に処理します。
2020
- **可読性**: `slow`(亀)・`fast`(兎)という変数名と、docstringでのアルゴリズム説明により、後から読んだ人がすぐに意図を理解できるようにします。
2121

22-
#### Python特有分析
22+
### Python特有分析
2323

2424
- **データ構造選択**: 今回は`list``deque``set`いずれも使わず、単純な変数(ポインタ)2つのみで実装します。これが最もメモリ効率の良い選択です。
2525
- **標準ライブラリ活用度**: 今回のアルゴリズムはシンプルなポインタ操作のみで完結するため、`collections``heapq`などの標準ライブラリは不要です。

Algorithm/Floyds-Tortoise-and-Hare/leetcode/141. Linked List Cycle/Claude Sonnet5/Linked_List_Cycle_TypeScript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272

7373
> 💡 **初学者向け補足**:コード全体を示す前に、このコードの大まかな構造(骨格)を示します。
7474
>
75-
> 1. まず、リストが空、または1つしかノードがない場合は、サイクルは作れないので`false`を返す
75+
> 1. まず、`head``null`(空リスト)または`head.next``null`(次のノードが存在しない)の場合は`false`を返す(※単一ノードでも自身を指すサイクルは作れるが、`head.next``null`ならサイクルは存在しない)
7676
> 2. 「遅いポインタ(slow)」と「速いポインタ(fast)」という2つの変数を用意し、両方とも`head`からスタートする
7777
> 3. ループの中で、`slow`は1つずつ、`fast`は2つずつノードを進める
7878
> 4. もし`slow``fast`が同じノードを指す瞬間が来たら、それは輪っかの中をぐるぐる回っている証拠なので`true`を返す

Algorithm/Floyds-Tortoise-and-Hare/leetcode/141. Linked List Cycle/Claude Sonnet5/README_react.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,8 @@ <h2 className="outfit text-[1.9rem] font-bold text-cyan-700 mb-4 pb-2 border-b-[
426426
step: 1,
427427
title: '入力を検証する',
428428
desc:
429-
'まず head が None(空リスト)か、head.next が None(ノードが1つだけ)かを確認します。' +
430-
'なぜなら、ノードが0個または1個では「次に進む」動作自体ができず、輪っかを作りようがないからです。' +
429+
'まず head が None(空リスト)か、head.next が None(次のノードが存在しない)かを確認します。' +
430+
'なぜなら、head が None または head.next が None の場合は次へ進むポインタ操作ができず、サイクルが存在しないからです。' +
431431
'例)head=[3,2,0,-4] の場合、どちらの条件にも当てはまらないので次のステップへ進みます。',
432432
visual: 'validate',
433433
},
@@ -685,7 +685,7 @@ <h2 className="outfit text-[1.9rem] font-bold text-cyan-700 mb-4 pb-2 border-b-[
685685
</p>
686686
<ol className="text-slate-700 text-sm space-y-1 list-decimal list-inside">
687687
<li>
688-
head が空、またはノードが1つだけならエッジケースとして即座に
688+
head が None、または head.next が None(次のノードが存在しない)ならエッジケースとして即座に
689689
False を返す
690690
</li>
691691
<li>slow・fast を head で初期化する</li>

public/Algorithm/Floyds-Tortoise-and-Hare/leetcode/141. Linked List Cycle/Claude Sonnet5/README_react.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,8 @@ <h2 className="outfit text-[1.9rem] font-bold text-cyan-700 mb-4 pb-2 border-b-[
426426
step: 1,
427427
title: '入力を検証する',
428428
desc:
429-
'まず head が None(空リスト)か、head.next が None(ノードが1つだけ)かを確認します。' +
430-
'なぜなら、ノードが0個または1個では「次に進む」動作自体ができず、輪っかを作りようがないからです。' +
429+
'まず head が None(空リスト)か、head.next が None(次のノードが存在しない)かを確認します。' +
430+
'なぜなら、head が None または head.next が None の場合は次へ進むポインタ操作ができず、サイクルが存在しないからです。' +
431431
'例)head=[3,2,0,-4] の場合、どちらの条件にも当てはまらないので次のステップへ進みます。',
432432
visual: 'validate',
433433
},
@@ -685,7 +685,7 @@ <h2 className="outfit text-[1.9rem] font-bold text-cyan-700 mb-4 pb-2 border-b-[
685685
</p>
686686
<ol className="text-slate-700 text-sm space-y-1 list-decimal list-inside">
687687
<li>
688-
head が空、またはノードが1つだけならエッジケースとして即座に
688+
head が None、または head.next が None(次のノードが存在しない)ならエッジケースとして即座に
689689
False を返す
690690
</li>
691691
<li>slow・fast を head で初期化する</li>

0 commit comments

Comments
 (0)