环形链表的约瑟夫问题(链表法,代码,注释)

 暂时水一下,后续会补,相关的公式法和递归,等做法(因为博主想水文还没看循环能做不)

环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)

环形链表的约瑟夫问题(链表法,代码,注释)_第1张图片

单链表法博主写的匆忙,应该有优化的地方,有时间会精进修改

代码.

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

这里不要脸求个三连(点赞,收藏 + 关注),你的小小的帮助,可以让博主开心一整天!

你可能感兴趣的:(链表,数据结构,c语言)