题目描述:
N个人围成一圈顺序编号,从1开始按1、2、3顺序报数,报3者退出圈外,其余的人再从1、2、3开始报数,报3的人再退出圈外,以此类推。请按退出顺序输出每个退出人的原序号。要求使用环行链表编程
输入描述:
输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50
输出描述:
输出m行,每行表示题目所求,用空格隔开
示例:
输入:
1
4
输出:
3 2 4 1
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
ListNode(int n):value(n),next(NULL){}
};
vector<int> order(int N)
{
ListNode* head=new ListNode(1);
ListNode* cur=head;
ListNode* next=NULL;
for(int i=2;i<=N;i++)
{
next=new ListNode(i);
cur->next=next;
cur=next;
}
cur->next=head;
vector<int> res;
ListNode* p1=head;
ListNode* p2=NULL;
ListNode* p3=NULL;
while(1)
{
p2=p1->next;
p3=p2->next;
res.push_back(p3->value);
p1=p3->next;
delete p3;
if(p1==p2) //只剩最后一个节点
break;
p2->next=p1;
}
res.push_back(p1->value);
return res;
}
int main()
{
int m;
cin>>m;
int count=0;
int N;
vector<int> M;
for(;count<m;count++)
{
cin>>N;
M.push_back(N);
}
for(int i=0;i<M.size();i++)
{
vector<int> res=order(M[i]);
for(int j=0;j<res.size();j++)
cout<<res[j]<<" ";
cout<<endl;
}
return 0;
}