循环删除报数问题



给定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<data<	  p->next = temp->next;
	  delete temp;
	  temp = NULL;
	  --count;
  }
  delete start;
  start = NULL;

}

 

 
  

你可能感兴趣的:(算法设计,struct,循环链表,循环报数,c++)