#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;
}