剣はオファー23を指します。リンクリスト内のリングのエントリノード

剣はオファー23を指します。リンクリスト内のリングのエントリノード

タイトル説明

ここに画像の説明を挿入

問題解決のアイデア

リング文言があるかどうか、次の誤った判断に注意してください。

while (fast != null && fast.next != null && fast != slow) {
    
    
	fast = fast.next.next;
	slow = slow.next;
}
if (fast != slow) return null;

注:リンクリストにノードが1つしかなく、それがリングを形成しない場合、この記述は間違っています。したがって、リングがあるかどうかを判断するときに、次のように変更できます。if (fast != null && fast.next != null) return null;

ただし、フラグビットを設定して明確にすることができます。

public class Solution {
    
    

    public ListNode EntryNodeOfLoop(ListNode pHead) {
    
    
        if(pHead == null) return null;
        ListNode fast = pHead, slow = pHead;  //快慢指针
        boolean hasCycle = false;  //标志是否有环
        while (fast != null && fast.next != null) {
    
    
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
    
    
                hasCycle = true;
                break;
            }
        }
        //没有环则直接返回null
        if (!hasCycle) return null;
        //如果有环,则令fast从头开始,并和slow同步移动,直到相遇,则为环的入口节点
        fast = pHead;
        while (fast != slow) {
    
    
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

おすすめ

転載: blog.csdn.net/cys975900334/article/details/115029495