面試系列9怎樣才能檢測到鏈表中存在循環(huán)

字號:

原題:
     怎樣才能檢測到鏈表中存在循環(huán) (from 《c專家編程》)
    解答:
     條件: 沒有任何條件。
     方法: 對訪問過的每個(gè)元素作個(gè)標(biāo)記,遍歷整個(gè)鏈表,當(dāng)?shù)谝淮斡龅阶鬟^標(biāo)記的元素,則找到了環(huán)的開始節(jié)點(diǎn)。
     條件: 鏈表存在于只讀存儲(chǔ)區(qū),不可做標(biāo)記。
     方法: 把已檢查過的節(jié)點(diǎn)指針放入一個(gè)數(shù)組中,每次檢查新的節(jié)點(diǎn)指針的時(shí)候,就在表中查找,看是否存在相同的節(jié)點(diǎn)。如果存在,則表明該節(jié)點(diǎn)為環(huán)的開始節(jié)點(diǎn)。那么通常的做法可以使用哈希表和散列函數(shù),來存放以檢查過的節(jié)點(diǎn)和檢查節(jié)點(diǎn),重點(diǎn)需要優(yōu)化的也是這個(gè)地方。
     條件: 鏈表長度是任意的,而且循環(huán)也可能出現(xiàn)在任何地方。
     方法: 首先,排除一種特殊的情況,就是3個(gè)元素的鏈表中第2個(gè)元素的后面是第1個(gè)元素。設(shè)置兩個(gè)指針p1和p2,p1指向第1個(gè)元素,p2指向第3個(gè)元素,看看它們是否相等。如果相等就屬于上述這種特殊情況。如果不等,把p1向后移一個(gè)元素,p2向后移兩個(gè)元素。檢查兩個(gè)指針的值,如果相等,說明鏈表中存在循環(huán)。如果不相等,繼續(xù)按照前述方法進(jìn)行。如果出現(xiàn)某個(gè)指針是null的情況,說明鏈表中不存在循環(huán)。如果鏈表中存在循環(huán),用這種方法肯定能夠檢測出來,因?yàn)樵趩捂湵淼沫h(huán)中其中一個(gè)指針肯定能夠追上另一個(gè)(兩個(gè)指針具有相同的值)。
    不過該方法可能需要對鏈表遍歷幾次才能檢測出來。