序文
「山の前にも山の後ろにも景色があり、風があってもなくても自由です。」
この章の内容は、リコウの毎日のランダムな質問に対するいくつかのメソッドのコード分析とフローチャートです。
提示:以下是本篇文章正文内容,下面案例可供参考
141. 循環リンクリスト I
リンクリストの先頭ノードheadを与え、リンクリストにリングがあるかどうかを判定します。
リンクされたリスト内に次のポインタを継続的に追跡することによって再び到達できるノードがある場合、リンクされたリスト内にサイクルが存在します。指定されたリンク リスト内のリングを表すために、評価システムは内部で整数 pos を使用して、リンク リストの末尾がリンク リストに接続される位置を示します (インデックスは 0 から始まります)。注: pos はパラメータとして渡されません。リンクリストの実態を特定するためだけに。
リンクされたリストに循環がある場合は true を返します。それ以外の場合は false を返します。
1.1 リンク:
141.リングリンクリストI リンク
1.2 アイデア:
速いポインター (一度に 2 ステップ) と遅いポインター (一度に 1 ステップ) を定義して、カメとウサギの間の競争に変換します。最終的には全員がリングに入り、速いポインタが遅いポインタに追いついたとき、リングがあることが証明されます。, リングがなければ、速いポインタが遅いポインタに追いつく状況はなく、速いポインタが NULL になった時点で終了します。
1.3 コード: 高速ポインタと低速ポインタ
bool hasCycle(struct ListNode *head)
{
struct ListNode *fast=head;
struct ListNode *slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{
return true;
}
}
return false;
}
1.4 フローチャート:
142. 循環リンクリスト II
リンク リストのヘッド ノード head を指定すると、リングへの参加を開始するリンク リストの最初のノードを返します。リンクされたリストが非巡回の場合は null を返します。
リンクされたリスト内に次のポインタを継続的に追跡することによって再び到達できるノードがある場合、リンクされたリスト内にサイクルが存在します。指定されたリンク リスト内のリングを表すために、評価システムは内部で整数 pos を使用して、リンク リストの末尾がリンク リストに接続される位置を示します (インデックスは 0 から始まります)。pos が -1 の場合、リストにはサイクルがありません。注: pos はパラメータとして渡されるのではなく、リンク リストの実際の状況を識別するためだけに使用されます。
リンクされたリストは変更できません。
2.1 リンク:
142. 循環リンクリスト II リンク
2.2 アイデア:
ポインタは合流点から歩き、ポインタはリンクされたリストの先頭から歩き、それらはエントリポイントで合流します。特殊推論:一般推論:
2.3 コード:
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *fast=head;
struct ListNode *slow=head;
struct ListNode *meet=NULL;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{
meet=slow;
while(meet!=head)
{
meet=meet->next;
head=head->next;
}
return head;
}
}
return NULL;
}
2.4 フローチャート:
詳しい質問と証明 (面接でよくある質問):
3.1 遅いと速いは一致しますか? (遅い場合は 1 ステップ、速い場合は 2 ステップ)
3.1.1 答え: (毎回 1 削減) は必ず満たされます
3.1.2 証明:
3.2 遅い場合は 1 ステップ、速い場合は n(3/4/5.…) ステップを実行しても問題ありませんか? (n > 2)
3.2.1 回答: 必ずしも満たす必要はない
3.2.2 証明:
要約する
終わりに、今日のリコウの毎日の質問内容はこれで終わりです。今後さらに知りたい場合は、フォローしてください。まだ書かれていない方法がたくさんあります。追加していただければ幸いです~