约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表。
题目:一些人围坐一圈报数,形成一个循环单链表,当报数是m或m的倍数时出将节点从单链表中删除,重新加入新的循环单链表,最后形成一个新的循环单链表。
- struct Node
- {
- int data;
- Node *next;
- };
- void circle(Node** head,int m)
- {
- Node* tmp1=*head;
- Node *tmp2=(*head)->next;
- int cnt=1;
- while(1)
- {
- cnt++;
- if(cnt%m==0)
- {
- *head=tmp2;
- tmp1->next=tmp2->next;
- tmp2=tmp2->next;
- break;
- }
- else
- {
- tmp1=tmp1->next;
- tmp2=tmp2->next;
- }
- }
- Node *tmp3=*head;
- while(tmp1!=tmp2)
- {
- cnt++;
- if(cnt%m==0)
- {
- tmp3->next=tmp2;
- tmp3=tmp3->next;
- tmp1->next=tmp2->next;
- tmp2=tmp2->next;
- }
- else
- {
- tmp1=tmp1->next;
- tmp2=tmp2->next;
- }
- }
- tmp3->next=tmp2;
- tmp2->next=*head;
- }
- int main( int argc, char** argv )
- {
- Node a[10];
- for(int i=0;i<9;i++)
- {
- a[i].data=i+1;
- a[i].next=&a[i+1];
- }
- a[9].data=10;
- a[9].next=&a[0];
- Node *aa=&a[0];
- Node **aaa=&aa;
- circle(aaa,5);
- 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 。。。