单链表经典算法OJ题--牛客(环形链表的约瑟夫问题

链接:环形链表的约瑟夫问题_牛客题霸_牛客网【点击即可跳转】

著名的Josephus问题
据说著名犹太历史学家 Josephus有过以下的故事:
  在罗马人占领乔塔帕特后,39 个犹太⼈与 Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被⼈抓到,于是决定了⼀个自杀方式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3人,该人就必须自杀,然后再由下一个重新报数,直到所有⼈都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在 第16个与第31个位置,于是逃过了这场死亡游戏。

思路:

1.创建带环链表

2.count计数(报到m,就删掉)

代码实现:

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

 typedef struct ListNode ListNode;
//创建节点
ListNode* BuyNode(int x)
{
   ListNode* node=(ListNode*)malloc(sizeof(ListNode));
   if(node==NULL)
   {
    exit(1);
   }
   node->val=x;
   node->next=NULL;
   return node;
}

//创建带环链表
ListNode* createNode(int n)
{
    //先创建第一个节点
  ListNode*phead=BuyNode(1);
  ListNode*ptail=phead;
for(int i=2;i<=n;i++)
{
  ptail->next=BuyNode(i);
  ptail=ptail->next;
}
  //首尾相连,链表成环
   ptail->next=phead;
   return ptail;
}

int ysf(int n, int m ) 
{
    ListNode*prev=createNode(n);
    ListNode*pcur=prev->next;
    int count=1;
    while(pcur->next!=pcur)//只有一个节点,就跳出循环
    {
      if(count==m) 
      {
        prev->next=pcur->next;
        free(pcur);  //销毁pcur节点
        pcur=prev->next;
        count=1;
      }
      else 
      {
        prev=pcur;
        pcur=pcur->next;
        count++;
      }
    }
  return pcur->val;
  //此时剩下的一个节点 就是要返回的节点里的值
}

感谢观看,如果对你有所帮助的话,点赞支持一下吧^.^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值