判斷一個單向鏈表是否有環和判斷一個單向鏈表是否是循環鏈表

 

判斷一個單向鏈表是否是循環鏈表比較簡單,只要將一個指針p指向表的第一個節點,而另外一個指針q指向
p的下一個節點,然後讓q向後滑動,直到q爲0或q等於p(此時表是循環鏈表)爲止。
而判斷一個單向鏈表是否有環有點兒麻煩,因爲鏈表的最後一個節點可能不是指向鏈表的頭結點而是其他節點.
考慮網上流行的步長法:
p=head
q=head
while(p && q && q->next)
{
p=p->next; q=q->next->next
if (p==q)
  return true
}
return 0;
正確性如下:
設鏈表的循環部分爲W1,W2,..,Wn,...,W2n.(先假設循環部分的節點數爲偶數)
設p第一次指向節點W1時, q指向Wk(2<=k<=n), 假設n-k爲偶數,則經過(n-k)/2次迭代後, q指向Wn,p指向第
1+(n-k)/2 個節點. 設經過x次迭代,兩個節點兩個指針相遇, 即1+(n-k)/2 + x= 2x, 從而x=1+(n-k)/2, 相遇的位置爲
2+n-k. 由於2<=k<=n, 因此2<=2+n-k<=n此後當p第一次指向節點n+1時,q再次指向W2.
然後p和q在節點W2n處相遇。
節點數目爲奇數時的情形類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章