問題一:鍊錶中是否存環?
問題二:鍊錶中環的入口結點是哪個?
問題三:鍊錶中環的結點數目(環的長度)是多少?
解答思路:
問題一:如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。
問題二:假設問題一中兩個不同步速遍歷的指標為p和q,其中p的步速為2,q的步速為1,假設指標q第一次到達入口結點x走了k步,那麼指標p已經走了2k步,假設環的長度為n,那麼p距離結點的距離為d = k%n,那麼q往前走多少步才會和p相遇呢?假設q往前走了y步與p相遇,則 n - d + y =2y,那麼y=n-d=n-k%n。即q向前y步即可與p相遇,此時q相距入口結點x的距離記為n-y = d=k%n,那麼從列表的頭觸發的指標r與指標q同時前進k步相遇。
問題三:第一次相遇(超一圈)時開始計數,第二次相遇時停止計數。
注:因為p和q相遇時p比q多走了一圈,而圈長不會大於整個鍊錶長度,所以q走過的路程不會大於整個鍊錶長度。
**問題一:
typedef struct node
node,*pnode;
int islooped(pnode phead)
return 0;
}
問題二:
pnode findentrance(pnode phead)
for(r = phead;q != r;q = q->next,r = r->next);
return r;
}
問題三:
int looplength(pnode phead)
while(1)
return 0;
}
測試程式:
void main()
,d = , c = , b = , a = ;
node y = , x = ;
node m = ;
e.next = &c;
m.next = &m;
printf("list a looped: %d\n",islooped(&a));
printf("loop length in list a: %d\n",looplength(&a));
printf("loop length in list m: %d\n",looplength(&m));
printf("entrance node of loop in list a: %c\n",findentrance(&a)->ch);
}
測試結果:
list a looped: 1
loop length in list a: 3
loop length in list m: 1
entrance node of loop in list a: c
ref:
1,2,
單鏈表中的環(總結)
當fast和slow相遇時,slow還沒有走完鍊錶,假設fast已經在環內迴圈了n 1 n 圈。假設slow走了s步,則fast走了2s步,又由於 fast走過的步數 s n r s 在環上多走的n圈 則有下面的等式 2 s s n r 1 s n r 2 如果假設整個鍊錶的長度是l,入口和相遇點的...
單鏈錶環問題
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?5 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 6 擴充套件 如何判斷兩個無環鏈表是否相交 7 擴充套件 如果相交,求出第乙個相交的節點 解法 1 對於問題1...
約瑟夫環 單鏈表
此演算法將頭指標head也進行data賦值 include typedef struct node 定義結構體 linknode,link int main void josephu link head,int n,int k,int m 此演算法將頭指標head賦予data值,以便於迴圈鍊錶結點的...