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

环形链表的约瑟夫问题

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
typedef struct ListNode LN;

struct ListNode* creatNode(int n)
{
    LN* newNode=(LN*)malloc(sizeof(LN));
    newNode->val=n;
    newNode->next=NULL;
    return newNode;
}

LN* creatCircle(int n)
{
    LN*phead=creatNode(1);//创建第一个节点
    LN*pcur=phead;
    int i=2;
    LN*newNode;
    while(i<=n)
    {
        newNode=creatNode(i++);
        pcur->next=newNode;
        pcur=pcur->next;
    }
    pcur->next=phead;
    return phead;
}

int ysf(int n, int m ) {
    // write code here
    int count=0;//报数的序号
    int peopleCount=n;
    LN*head=creatCircle(n);//创建环形链表
    LN*pcur=head;
    LN*prev=head;
    while(prev->next->val!=1)//找到尾节点
    {
        prev=prev->next;
    }
    while(1)
    {
        count++;
        if(count==m)//报到m删除节点
        {
            if(peopleCount==2)
            {
                return prev->val;
            } 
            prev->next=pcur->next;
            count=0;
            peopleCount--;
            pcur=pcur->next;
        }
        else 
        {
            pcur=pcur->next;
            prev=prev->next;
        }
        
    }
}



全部评论

相关推荐

中电45所 测试开发岗 提供员工宿舍,工资一般,加班到7-8点,周六加班,早8晚5 硕士
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务