鍊錶是否帶環?環長 入口?時間複雜度?

2021-09-30 14:31:46 字數 1155 閱讀 1911

【是否帶環】

基本思路:定義兩個指標從頭結點開始,乙個一次向後走一步,一次走兩步,迴圈,若能夠走到null,則不帶環,若走到兩個指標相等,則帶環。

**如下:

pairhascircle(pnode phead)//判斷是否帶環,帶環的話環的長度,入口。

} return make_pair(false,(pnode)null);

}

【環長】

基本思路:判斷完是否帶環後,返回相遇位置,定義兩個指標,乙個整形count初始化為0,再從相遇位置開始,乙個指標一次走一步,乙個指標一次走兩步,count++, 等到再次相遇時,返回count的值即為環長。

**如下:

int lenofcircle(pnode phead)//帶環求環的長度 時間複雜度為o(n)

pnode pcur = res.second;

pnode prev = pcur;

int count = 0;

while(true) }

}

【環的入口】

基本思路:

第一次相遇時的位置知道後,則從頭到入口的距離和相遇點到入口的距離相等(後有具體證明),則可以讓乙個指標從頭開始走,乙個指標從相遇點開始走,走到兩個指標相遇,則相遇點就是入口點。

證明:(理科生,所以用公式來證明)

求環長時,相遇點在5的地方,若pcur一步走兩個,則pcur的路徑為:l+r+h+r(也就是一圈然後在加上r),

prev的路徑是:l+r,而這兩個指標的路徑又是有2倍的關係。

則:l+2r+h = 2*(l+r)

解上面的式子可以得到:l = h,也就是從頭到入口的距離和從相遇點到入口的距離相等。

**如下:

pnode enterofcircle(pnode phead)//帶環求環的入口點//以及求時間複雜度o(n)

pnode pcur = res.second;

pnode prev = phead;

while (true) }

}

鍊錶 是否帶環,環的長度以及入口點

求環的入口點 listnode meetnode listnode phead listnode fast phead listnode slow phead while fast next next null if fast next next null slow phead while fast...

鍊錶是否有環?環入口點?

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單向鍊錶是否有環,環起點,環長,鍊錶長

一 判斷單向鍊錶是否有環 方法1 設定乙個hashset,順序讀取鍊錶中的節點,判斷hashset中是否有該節點的唯一標識 id 如果在hashset中,說明有環 如果不在hashset中,將節點的id存入hashset。這種方法時間複雜度已經最優,但是因為額外申請了hashset,所以空間複雜度不...