题解 | 环形链表的约瑟夫问题

环形链表的约瑟夫问题

https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
#include<stdlib.h>

//开辟链表
typedef struct people
{
    int n;      //序号
    struct people* next;
}peo;

void kai_pi(peo*pe,int n)   //开辟大小为n的链表。
{
    peo* p = pe;            //保留头部指针。
    peo* newNode = NULL;
    int i = 2;              //链表的头部我提前开辟好了,所以从第2个开始添加。
    for (i = 2; i <= n; i++)
    {
        newNode = (peo*)malloc(sizeof(peo));
        if (newNode == NULL)
        {
            printf("开辟失败 \n");
            exit(1);
        }
        newNode->n = i;
        newNode->next = NULL;
        p->next = newNode;
        p = p->next;
    }
    p->next = pe;           //首尾相连成环。
    return;
}

void shan_chu(peo* pe, int n) //删除点到的成员。
{
    peo* p = pe;
    int i = 0;
    for (i = 0; i < n - 1; i++) //因为是环形,所以向后第n-1个就是他前面那个成员。
    {
        p = p->next;
    }
    p->next = pe->next;    
}

int ysf(int n, int m)
{
    peo pe;             //初始化头成员,因为至少有一个人。
    pe.n = 1;
    pe.next = NULL;

    peo* ppe = &pe;     //用指针用习惯了。
    kai_pi(ppe, n);

    while (n != 1)      //转圈找被点到的那个,把他踢出去,知道只剩1人,n=1;
    {
        
        int i = 1;      
        for (i = 1; i < m; i++)   
        {
            ppe = ppe->next;
        }
        shan_chu(ppe, n);
        ppe = ppe->next;  //找到被踢的那人的下一个人。

        n--;
    }
    return ppe->n;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-02 22:46
点赞 评论 收藏
分享
合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务