JavaScript判斷單鏈表中是否存在環
如下圖, 單鏈表中存在環:
怎麼判斷單鏈表中存在環呢?先創造一下帶環的單鏈表:
程式碼如下:
建立帶環單鏈表:
結果可見:
判斷單鏈表是否帶環,以下有三種方法:
第一種方法, 建立雜湊表,不過會佔用較大的空間,不是最佳方法.( 時間複雜度O(n) )
遍歷連結串列,將連結串列各節點新增至雜湊表中,新增前判斷此節點是否已存在雜湊表中,存在的話說明連結串列中存在環.
結果如下:
檢測到節點B是重複項,說明存在環
第二種方法: 給節點新增visited訪問標記 (時間複雜度O(n)), 不需要額外的空間
遍歷連結串列,每訪問一個新節點,使其visited為1,每次訪問節點前先判斷其visited是否為1,為1則是已訪問過的節點,說明連結串列中存在環.
結果可見:
遍歷連結串列前,連結串列每個節點visited都為0,都沒被訪問過
B節點的visited為1,說明已訪問過B,連結串列中存在環
遍歷後,連結串列中每個節點visited都為1,每個節點都被訪問過
第三種方法: 快慢指標法,設定快指標fast,慢指標slow,每次迴圈快指標fast移動兩個位置,慢指標移動一個位置
(時間複雜度 O(n)) 需要額外的空間
結果可見:
快指標fast和慢指標slow在節點D相遇,說明連結串列中存在環
原理如下圖: