约瑟夫环

#include <iostream>
 
using namespace std;
struct Node//定义单链表 
{
    int val;
    Node* next;
    Node(int _val):val(_val),next(nullptr){}
} ;
class JoCycle{//定义环
    private:
        Node* tail;//记录尾节点
    public:
        JoCycle():tail(nullptr){}
        void Add(int num);
        void Eliminate(int  step);
        void Print(); 
};
void JoCycle::Add(int num)
{
    if(tail==nullptr)//环为空的情况 
    {
        Node* new_node=new Node(num);
        tail=new_node;
        tail->next=tail;
    }
    else
    {
        Node* new_node=new Node(num);
        new_node->next=tail->next;//新节点指向头节点,构成环 
        tail->next=new_node;//尾节点指向新节点
        tail=new_node;//尾节点为新节点 
    }
}
void JoCycle::Eliminate(int step)
{
    Node* p=tail;
    while(p!=nullptr && p->next!=p)//存在节点且不止一个节点
    {
        for(int i=0;i<step-1;++i)
        {
            p=p->next;
        }
        Node* eliminate=p->next;
        p->next=eliminate->next;//删除节点
        if(eliminate==tail)//正好删掉tail 
        {
            tail=p;
        } 
        cout<<"delete "<<eliminate->val<<endl;
        delete eliminate;//释放节点 
        Print(); 
    }
    
}
void JoCycle::Print()
{
    Node* cur=tail->next;
    while(cur!=tail)
    {
        cout<<cur->val<<" ";
        cur=cur->next;
    }
    cout<<tail->val<<endl;
} 
int main(int argc, char *argv[])
{
    JoCycle jc;
    for(int i=1;i<6;++i)
    {
        jc.Add(i);
    }
    jc.Eliminate(3);
    cout<<"-----"<<endl; 
    //数学归纳法 
    int m=3;//间隔 
    int ans(0);
    for(int i=1;i<6;++i)
    {
        ans=(ans+m)%i;
    }
    cout<<ans+1<<endl;
    return 0;
}

 

posted @ 2022-02-08 17:12  菠萝超级酸  阅读(19)  评论(0编辑  收藏  举报