C++循环链表解决约瑟夫问题

算法

1.构建循环链表
2.设置计数器count模拟报数
3.如果报数为k则删除结点且重置count
4.重复操作3直到只剩下一个结点为止

代码

void Joseph(int n,int k)
{
    //1.构建循环链表
    Node<int>* head = new Node<int>(1,nullptr);
    Node<int>* pre = head;
    for(int i=2;i<=n;i++)
    {
        Node<int>* newNode = new Node<int>(i,nullptr);
        pre->next = newNode;
        pre = pre->next;
        //如果是最后一个结点
        if(i == n) pre->next = head;
    }
    //2.设置count计数器模拟报数
    int count = 0;
    //3.遍历链表直到只剩下一个结点为止
    Node<int>* p = head;
    pre = p;
    while(p!=p->next){
        //报数
        count++;
        //如果报数为k则删除结点
        if(count == k){
            pre->next = p->next;
            cout<<p->x<<',';
            //重置计数器重新开始报数
            count = 0;
            delete p;
            p = pre->next;
        }
        //如果报数不是k则向后报数
        else{
            pre = p;
            p = p->next;
        }
    }
    //打印最后一个元素
    cout << p->x <<endl;
    delete p;
}
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页

打赏

漫步孤独之海

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者