给定n个排成一圈的人,他们依次循环报数:1,2,。。。,m;当报到m时,这个人就被踢出队伍。
比如:n=6,m=3;那么将依次踢出:3,6,4,2,5,1
算法:输入n,m
输出:按被踢出顺序输出踢出的人
思路:利用链表,指针p每次删除元素前调用p=p->next m-1次,利用循环链表表示“圈”
void circleDelete(int n, int m){
struct mylist{
int data;
mylist* next;
};
mylist * start = new mylist;
start->next = new mylist;
mylist * p = start->next;
int count = 0;
assert(n >=1 && m >= 1);
do //构造1,2,3,。。。,n循环链表
{
p->data = ++count;
p->next = (count < n? new mylist : start->next);
p = p->next;
} while (p != start->next);
p = start;
while(count > 0){
for(int i = 0; i < m-1; ++i){
p = p->next;
}
mylist * temp = p->next;
cout<<temp->data<<endl;
p->next = temp->next;
delete temp;
temp = NULL;
--count;
}
delete start;
start = NULL;
}