約瑟夫環問題---循環單鏈表

約瑟夫環問題是比較經典的問題,原來做的題目是依次輸出數字,而原來的循環鏈表結構不改變,今天遇到一道題是要求按照順序重新組成一個循環單鏈表。

題目:一些人圍坐一圈報數,形成一個循環單鏈表,當報數是m或m的倍數時出將節點從單鏈表中刪除,重新加入新的循環單鏈表,最後形成一個新的循環單鏈表。

 

  1. struct Node  
  2. {  
  3.     int data;  
  4.     Node *next;  
  5. };  
  6.  
  7. void circle(Node** head,int m)  
  8. {  
  9.     Node* tmp1=*head;  
  10.     Node *tmp2=(*head)->next;  
  11.     int cnt=1;  
  12.     while(1)  
  13.     {  
  14.         cnt++;  
  15.         if(cnt%m==0)  
  16.         {  
  17.             *head=tmp2;  
  18.             tmp1->next=tmp2->next;  
  19.             tmp2=tmp2->next;  
  20.             break;  
  21.         }  
  22.         else 
  23.         {  
  24.             tmp1=tmp1->next;  
  25.             tmp2=tmp2->next;  
  26.  
  27.         }  
  28.     }  
  29.     Node *tmp3=*head;  
  30.     while(tmp1!=tmp2)  
  31.     {  
  32.         cnt++;  
  33.         if(cnt%m==0)  
  34.         {  
  35.             tmp3->next=tmp2;  
  36.             tmp3=tmp3->next;  
  37.             tmp1->next=tmp2->next;  
  38.             tmp2=tmp2->next;  
  39.           
  40.         }  
  41.         else 
  42.         {  
  43.             tmp1=tmp1->next;  
  44.             tmp2=tmp2->next;  
  45.  
  46.         }  
  47.     }  
  48.     tmp3->next=tmp2;  
  49.     tmp2->next=*head;  
  50.  
  51. }  
  52.  
  53.  
  54. int main( int argc, char** argv )  
  55. {  
  56.       
  57.     Node a[10];  
  58.     for(int i=0;i<9;i++)  
  59.     {  
  60.         a[i].data=i+1;  
  61.         a[i].next=&a[i+1];  
  62.     }  
  63.     a[9].data=10;  
  64.     a[9].next=&a[0];  
  65.     Node *aa=&a[0];  
  66.     Node **aaa=&aa;  
  67.     circle(aaa,5);  
  68.     return -1;  

原始:1 2 3 4 5 6 7 8 9 10 1 2 。。。

結果:5 10 6 2 9 8 1 4 7 3 5 10 6 2 。。。

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