学習目標:
私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!
!!!
歴口質問銀行質問141公式リンク
学習コンテンツ:
循環リンクリスト
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
例1:
入力:head = [3,2,0、-4]、pos = 1
出力:true
説明:リンクリストに、テールが2番目のノードに接続されているサイクルがあります。
例2:
入力:head = [1,2]、pos = 0
出力:true
説明:リンクリストに、テールが最初のノードに接続されているサイクルがあります。
例3:
入力:head = [1]、pos = -1
出力:false
説明:リンクリストにサイクルがありません。
提示:
链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/linked-list-cycle
勉強の時間:
2022.1.21
学習出力:
アイデア1
ハッシュ表
問題解決のアイデア
- 循環リンクリストでのハッシュテーブルの使用を判断するための中心的なアイデアは、ノードの重複がありますか?リングが形成されている場合、次にトラバースを続けると、前に表示されたノードに確実に遭遇します。
- この繰り返されるノードは、リンクリストにリングがあることを意味します。
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public bool HasCycle(ListNode head) {
List<ListNode> ListNodes=new List<ListNode>();
if(head==null||head.next==null)
return false;
while(head.next!=null){
if(ListNodes.IndexOf(head)!=-1){
return true;
}else{
ListNodes.Add(head);
head=head.next;
}
}
return false;
}
}
アイデア1
ダブルポインタ
問題解決のアイデア
- ダブルポインターの中心的なアイデアは、高速ポインターと低速ポインターを設定することです。高速ポインタは固定長で移動し、低速ポインタは高速ポインタよりも移動が少なくなります。たとえば、高速ポインタは毎回2回(次の次)移動し、低速ポインタは一度に1回移動します
- リングがある場合、高速ポインタと低速ポインタは常に1か所で合流します。また、この会議時間は定期的です。リングが比較的小さい場合、それらはすぐに出会います。リングが大きいと何回もかかります。
- また、移動の長さは必ずしも2と1である必要はありません。たとえば、一度に3回移動し、一度に1回移動しても、どこかで会うことができます。
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public bool HasCycle(ListNode head) {
if (head == null||head.next==null) {
return false;
}
ListNode Low=head;
ListNode Fast=head.next;
while(Low!=null&&Fast!=null&& Fast.next!=null){
if(Fast==Low){
return true;
}
Low=Low.next;
Fast=Fast.next.next;
}
return false;
}
}
著者:モルモットXiaohuihui
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。