约瑟夫环问题---循环单链表

约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表。

题目:一些人围坐一圈报数,形成一个循环单链表,当报数是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 。。。

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