题目 :编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。
下一个人继续从 1 开始报数。
n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
数据范围: 1≤n,m≤100001≤n,m≤10000
思路:循环链表
typedef struct ListNode ListNode;
ListNode* buynode(int x)//导入数据
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
if(node==NULL)
{
exit(1);
}
node->val=x;
node->next=NULL;
return node;
}
ListNode* createCircle(int n)//创建循环链表
{
ListNode*phead =buynode(1);
ListNode*ptail=phead;
for(int i=2;i<=n;i++)
{
ptail->next=buynode(i);
ptail=ptail->next;
}
ptail->next=phead;
return ptail;//返回尾结点
}
int ysf(int n, int m ) {
//主函数
ListNode*prev=createCircle(n);
ListNode*pcur=prev->next;
int count =1;
while(pcur->next!=pcur)//结束条件 头和尾相同
{
if(count==m)
{
prev->next=pcur->next;
free(pcur);
pcur=prev->next;
count=1;//销毁结点
}
else
{
prev=pcur;
pcur=pcur->next;
count++;
}
}
return pcur->val;
}