單鏈表中的環

2021-09-30 11:10:03 字數 1513 閱讀 8574

問題一:鍊錶中是否存環?

問題二:鍊錶中環的入口結點是哪個?

問題三:鍊錶中環的結點數目(環的長度)是多少?

解答思路:

問題一:如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。

問題二:假設問題一中兩個不同步速遍歷的指標為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值,以便於迴圈鍊錶結點的...