(程序员面试宝典)已知n个人围坐在一张圆桌旁,从编号为k的人开始..................

【题目】

设有n个人(以编号为1,2,3…….n分别表示)围坐在圆桌周围,从编号为k的人开始报数,数到m的人就站出来,他的下一个人又从1开始报数,数到m的人就站出来,依此规律重复下去,知道全部的人都站出来为止。

【代码实现】

这里选择循环链表作为数据结构。

#include<iostream>
using namespace std;
struct node
{
  int data;
  node *next;
};
class linklist
{
public:
     linklist() //利用构造函数对循环链表进行初始化
     {
       node *p=new node();
       p->data=1;
       p->next=p;
       first=p;
     };
    void josephus(int n,int k,int m);
private:
    node *first;  
};

void linklist::josephus(int n,int k,int m)
{
  node *q=first;
  for(int i=2;i<=n;i++)    //建立循环链表(编号为1,2,3..........N)
  {
    node *p=new node();
    p->data=i;
    p->next=q->next;
    q->next=p;
    q=p;
  }
   //---------找到第一个报数的人,p记录当前报数的位置,r为报数的前一个位置----------
  node *p=first; 
  node *r;
  while(--k)
  {
    r=p;;     
    p=p->next;
  }

  //----------把这n个元素依次出列--------
  cout<<"n个元素依次出列:";
  while(n--)
  {
    for(int s=1;s<m;s++)  //从当前元素开始报数,报数为m的元素出列,p指向出列元素
    {
        r=p;
        p=p->next;
    }  
      r->next=p->next;     
      cout<<p->data<<" ";
      p=r->next;          //此时p指向被删元素的下一个元素
  }
  cout<<endl;

}
int main()
{
  linklist L;
  L.josephus(9,1,5);
  system("pause");
  return 0;
}

【运行结果】

(程序员面试宝典)已知n个人围坐在一张圆桌旁,从编号为k的人开始.................._第1张图片

你可能感兴趣的:(循环链表,程序员面试宝典)