LeetCode-環形鏈表|+環形鏈表||

環形鏈表 | 和 || 題型相似且 || 是 | 的升級版,故放一起。

1.題 | 如下:
在這裏插入圖片描述
2.題目分析:
返回的是一個布爾型的結果,如果有環返回true,無環返回false。
在這裏插入圖片描述
3.源代碼:




bool hasCycle(struct ListNode *head) {
   
   
    if(head==NULL)
    return false;
    struct ListNode *solw=head;
    struct ListNode *fast=head;
    while(fast && fast->next){
   
   
        solw=solw->next;
        fast=fast->next->next;//使快指針比慢指針快二步
        if(solw==fast){
   
   
            return true;//快慢指針相遇即有環
        }
    }
    return false;//無環
}

1.題 || 如下:
在這裏插入圖片描述
在這裏插入圖片描述
2.題目分析:
在這裏插入圖片描述
3.源代碼:




struct ListNode *detectCycle(struct ListNode *head) {
   
   
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast&&fast->next){
   
   
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
        break;//判斷有環
    }
    if(fast==NULL||fast->next==NULL){
   
   
        return NULL;//無環情況
    }
    else{
   
   
    struct ListNode* meet=slow;
    while(1){
   
   //由題目分析推斷關係得如下且用while(1)死循環
        if(meet==head)
        break;//一定是先判斷保證情況二也可以考慮到
        head=head->next;
        meet=meet->next;
    }
    return meet;  
    }
    return 0;
}

4.總結:

1.解決類似問題以及鏈表中的問題可以多考慮用快慢指針解決。
2. 解決的第二題爲什麼快指針要比慢指針快二倍不可以是別的:
如果是三步:X X-2 X-4 X-6…如果X是奇數快慢指針就會錯過不會像兩步一樣每走一步之間的距離每縮小一步。類推別的也就不可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章