暂时水一下,后续会补,相关的公式法和递归,等做法(因为博主想水文还没看循环能做不)
环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)
单链表法博主写的匆忙,应该有优化的地方,有时间会精进修改
代码.
typedef struct SLRoundList{
int data;//存编号
struct SLRoundList* next;//下一节点指针
}SLRList;
//申请一个节点空间,返回指向节点的指针
SLRList* MallocNode(int x)
{
SLRList* ps = (SLRList*)malloc(sizeof(int));
//assert(ps)由于是在线做题,就写的没这些判断了,
ps->data = x;
ps->next = NULL;
return ps;
}
//删输入指针pos的下一个节点
void Erase(SLRList* pos)
{
SLRList* p1 = pos->next->next;
free(pos->next);
pos->next = p1;
}
int ysf(int n, int m ) {
// write code here
SLRList* ps = MallocNode(1);//当头节点的样子使用
//,方便第一个申请空间的特殊情况归入进下面的for循环里 "pt->next"第一次是NULL的话不好操作
SLRList* pt = ps;
for(int i = 2; i <= n; i++){
pt->next = MallocNode(i);
pt = pt->next;
}
pt->next = ps;//首尾相连
for(int i = 1; 1; i++){//持续数个数,要数到m*(n-1)才结束,图省事写了个1,
//不想要后面的if判断的话,可以改一下
if(i % m == 0){
Erase(pt);
continue;
}
pt = pt->next;
if(pt->next == pt){
break;
}
}
return pt->data;
}
这里不要脸求个三连(点赞,收藏 + 关注),你的小小的帮助,可以让博主开心一整天!