循环链表解决报数问题

### 题目描述
有n个人,编号为1~n,围成一个圈,从第一个人开始报数,报到m的出列,再由下一个人开始从1往后报,直到所有人出列,请依次输出出列人的编号
#### 样例
输入:10 3
输出:3 6 9 2 7 1 8 5 10 4

概述:创建一个动态链表,且是头尾相连的循环链表
        优点是能及时释放内存
        缺点是需要管理空间,容易出错


#include<iostream> 
using namespace std;
//链表节点的定义
struct node{
    int data;
    node *next;
};


int main()
{
//这里开始是构建循环链表
    int n,m;
    cin>>n>>m;
    node * head , *p, *now, *prev;    //定义变量
    head = new node;    head ->data=1;  head->next=NULL;//设置头节点                
    now = head;    //当前指针设成头节点
    for(int i=2;i<=n;i++)
    {
        p = new node;  p->data=i;   p->next=NULL;   //设置新结点
        now->next=p;       //尾插
        now=p;           
    }
    now->next=head;    //最后把尾节点指向头节点就构成了循环链表
    
 //这里开始我们利用链表返回报数的人的数据
     now = head ,prev = head;
    while((n--)>1)     //每次出去一个人所以循环n遍,但是因为最后一个输出不带空格所以单独处理,实际上是n-1次
  {
    for(int i=1;i<m;i++)
    {
        prev=now;
        now=now->next;  //数n个节点,当前now就是我们要返回的节点
    }
    printf("%d ",now->data);  //这里有空格
    prev->next=now->next;   //跳过这个节点
    delete now;             //删除这个节点
    now=prev->next;
  }
  printf("%d",now->data);   //最后一个没有空格
  delete now;
  return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值