求單連結串列是否有環 環長 入環點 鏈長

2022-08-05 14:51:17 字數 1043 閱讀 2182

用兩個快慢指標去判斷單連結串列是否環,快指標的速度是慢指標的兩倍,若單連結串列有環,則兩個指標會先後進入環內,並且快指標會從後面追上慢指標。下面來嚴謹地分析一下兩個指標在環內相遇的情況。

假設此時慢指標s和快指標f都在環內,相隔k點,環內共有r點,t時間之後,兩指標相遇。

[快指標最終位置 = 慢指標最終位置] -> [(2t mod r) + k = (t mod r)] 假設 2t = ar + x, t = br + y, a > b

-> 2t - ar + k = t - br

-> t = (a - b)r - k

typedef

struct nodenode_t;

int testloop(node_t *head)

}return

0;//no loop

}

t = (a - b)n - k
我們在上面推匯出在環內相遇要經過的時間t,那麼現在從第一次相遇(k=0)開始算,一直到第二次相遇,慢指標剛好走過一個環長n,即環長等於第一次相遇到第二次相遇,慢指標走的長度。假設第一次相遇點離入環口的距離是x,那麼

快指標走的距離:2s = y + nr + x

慢指標走的距離:s = y + x (慢指標在第一次相遇時,不會走到完整的一環)

-> y = nr - x (n不一定是1,環內的指標可能要轉幾圈才會和環外的指標相遇)
那麼我們在第一次相遇時,把慢指標留在原地,把快指標放回起點head處,然後把快指標變為慢指標,兩個指標一起以速度1前進,當它們相遇時,相遇點就是入環點4

問題2求出環長,問題3求出入環點即y的長度,那麼鏈長只要將它們相加即可。

【reference】

1.2.