以下圖, 單鏈表中存在環:spa
怎麼判斷單鏈表中存在環呢?先創造一下帶環的單鏈表:指針
代碼以下:ip
建立帶環單鏈表:it
結果可見:ast
判斷單鏈表是否帶環,如下有三種方法:
第一種方法, 建立哈希表,不過會佔用較大的空間,不是最佳方法.( 時間複雜度O(n) )class
遍歷鏈表,將鏈表各節點添加至哈希表中,添加前判斷此節點是否已存在哈希表中,存在的話說明鏈表中存在環.原理
結果以下:cli
檢測到節點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相遇,說明鏈表中存在環
原理以下圖: