c语言的约瑟夫环问题,提交到oj上总是显示运行超时,怎么解决啊义父们

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
   int data;
   struct node *next;
}Node;

void josephusFn(int n,int k)
{
    //创建循环链表
    Node *head= NULL,*p= NULL,*r= NULL;

    head = (Node *)malloc(sizeof (Node));
    if(head == NULL)
    {
        printf("failed");
        return;
    }

    head->data = 0;
    head->next = NULL;
    p = head;
    //创建
    for(int i=1;i < n;i++)
    {
        r=(Node *)malloc(sizeof (Node));
        r->data = i;
        r->next =NULL;
        p->next = r;
        p = r;
    }

    p->next = head;
    p = head;

    while(p->next != p)
    {
        for(int i = 1;i < k;i++)
        {
            r=p;
            p=p->next;
        }
        printf("%d ",p->data +1);
        r->next = p->next;
        p = p->next;
    }
    printf("%d ",p->data +1);
    printf("\n");
}


int main()
{
    int n,k;
//    while(1)
//    {
       scanf("%d %d",&n,&k);
       josephusFn(n,k);
//    }
    return 0;
}
 

建议阅读:《具体数学》by Ronald L. Graham / Donald E. Knuth / Oren Patashnik

或者百度:这里

题主的算法时间复杂度太高,不是最优解