用环形链表实现约瑟夫环问题
1 typedef struct node 2 { 3 int data; 4 struct node * next; 5 }Node, *Link; 6 7 Link create(int n) //生成环形链表 8 { 9 Link head, rear ; 10 Link p = new Node; //第n个节点 11 p->data = n; 12 head = rear = p; 13 for( int i=n-1; i>0; i-- ) //从前面插入n-1个节点,注意,单项链表是便于逆向顺序构成的。 14 { 15 p = new Node; 16 p->data = i; 17 p->next = head; 18 head = p; //每插入一个节点,头指针前移一个 19 } 20 rear->next = head ; //n节点指向头节点,构成环形链表 21 return h; 22 } 23 24 int joseph( int m, Link h ) //找出最后一个 25 { 26 Link p = h; 27 int i=0; 28 while( p->next != p ) //只有一个节点时结束循环 29 { 30 i++; 31 if( i == m-1) //数了m-1个节点 32 { 33 Link q = p->next ; //删除下一个,即第m个 34 p->next = q->next ; 35 delete q; //因为结点都是new出来的内存堆区域里的空间,所以必须delete才能收回 36 i = 0; //删除一个节点,计数器置为0 37 } 38 p =p->next ; 39 } 40 int last= p->data ; 41 delete p; //删除最后一个节点,避免内存泄露 42 return last; 43 }