強制バックルブラシ質問百日計画Day12リングチェーンリスト強制バックル質問バンク質問141C#ハッシュテーブル+ダブルポインター

学習目標:

私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!

歴口質問銀行質問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

ハッシュ表
ここに画像の説明を挿入

問題解決のアイデア

  1. 循環リンクリストでのハッシュテーブルの使用を判断するための中心的なアイデアは、ノードの重複がありますか?リングが形成されている場合、次にトラバースを続けると、前に表示されたノードに確実に遭遇します。
  2. この繰り返されるノードは、リンクリストにリングがあることを意味します。
    ここに画像の説明を挿入
/**
 * 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

ダブルポインタ
ここに画像の説明を挿入

問題解決のアイデア

  1. ダブルポインターの中心的なアイデアは、高速ポインターと低速ポインターを設定することです。高速ポインタは固定長で移動し、低速ポインタは高速ポインタよりも移動が少なくなります。たとえば、高速ポインタは毎回2回(次の次)移動し、低速ポインタは一度に1回移動します
  2. リングがある場合、高速ポインタと低速ポインタは常に1か所で合流します。また、この会議時間は定期的です。リングが比較的小さい場合、それらはすぐに出会います。リングが大きいと何回もかかります。
  3. また、移動の長さは必ずしも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
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。

おすすめ

転載: blog.csdn.net/m0_48781656/article/details/122611641