如何判斷鍊錶中是否有環

2021-06-22 08:36:58 字數 1547 閱讀 8377

今天面試被問住了,很慚愧啊,回來上網查了一下思路。自己寫了點程式。

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。

2.如何計算環的長度?第一次相遇(超一圈)時開始計數,第二次相遇時停止計數。

3.如何判斷環的入口點:碰撞點p到連線點的距離=頭指標到連線點的距離,因此,分別從碰撞點、頭指標開始走,相遇的那個點就是連線點。

為什麼呢?需要乙個簡單的計算過程:

(1)當fast與slow相遇時,show肯定沒有走完鍊錶,而fast已經在還裡走了n(n>= 1)圈。假設slow走了s步,那麼fast走了2s步。fast的步數還等於s走的加上環裡轉的n圈,所以有:

2s = s + nr。因此,s = nr。

(2)設整個鍊錶長為l,入口據相遇點x,起點到入口的距離為a。因為slow指標並沒有走完一圈,所以:

a + x = s,帶入第一步的結果,有:a + x = nr = (n-1)r + r = (n-1)r + l - a;即:

a = (n-1)r + l -a -x;

這說明:從頭結點到入口的距離,等於轉了(n-1)圈以後,相遇點到入口的距離。因此,我們可以在煉表頭、相遇點各設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。

也許大家有乙個問題,就是為什麼「當fast與slow相遇時,show肯定沒有走完鍊錶」。這個問題比較坑,我也沒有找到很好的證明。不過大家自己畫幾個試試,會發現的確是這樣。

4.如何判斷兩個鍊錶(不帶環)是否相交?將其中的乙個鍊錶首尾相連,然後判斷另乙個鍊錶是否帶環即可。這個比較簡單,程式就省略了。

[cpp]view plain

copy

#include 

typedef

struct

node  

node,*pnode;  

//判斷是否有環

bool

isloop(pnode phead)  

}  if(fast == null || fast->next == null  )  

return

false

;  else

return

true

;  }  

//計算環的長度

intlooplength(pnode phead)  

//計數

if(begin == 

true

)  ++length;  

}  return

length;  

}  //求出環的入口點

node* findloopentrance(pnode phead)  

}  if(fast == null || fast->next == null)  

return

null;  

slow = phead;  

while

(slow != fast)  

return

slow;  

}  

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...

如何判斷鍊錶中是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...

如何判斷鍊錶中是否有環

1.如何判斷鍊錶是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 相遇點到環入口的距離 頭指標到環入口的距離,因此,分別從相遇點 頭指標開始走,相遇...