對一個連結串列判斷是否有環

閥噪發表於2020-10-09

目前能想到的是兩種:一:在遍歷的同時對其節點進行儲存(儲存方式多樣);

                                    二:設定兩個指標(變數),利用速度(遍歷快慢)差,進行判斷。

一:採用容器unordered_set ,進行儲存;(set為集合即不能插入相同的)

關於容器unordered_set;

https://blog.csdn.net/qq_32172673/article/details/85160180

bool Set_Cirlist(ListNode*head){
    unordered_set<ListNode*> Lset;
    while(head!=nullptr){    //  當頭指標不為空時執行
      if(Lset.count(head)){            //count函式返回相同元素個數
         return true;    //即在Lset中存在相同的元素 返回true            
        }
      Lset.insert(head); //插入資料
      head=head->next;  //指標向後移動;
    }
    return false;
}

二:設定兩個指標變數。

對於兩個指標變數Fpos,Spos;對於兩個有速度差的量,如果重逢,便存在環;

bool Speed_Cirlist(ListNode*head){
    if(head==nullptr||head->next==nullptr) //為空時,以及一個元素時
        return false;
    ListNode*Fpos=head;
    ListNode*Spos=head->next;
    while(Fpos!=Spos){
        if(Spos == nullptr || Spos->next==nullptr)        //新增判斷
            return false;
        Fpos=Fpos->next;
        Spos=Spos->next->next; //那麼後面第二個是否存在/或者為空,即->next、->next->next後是否為空,便需要在前面新增判斷
    }
    return true;
}

 

相關文章