环形链表约瑟夫问题(有全部代码!!!)

本文详细介绍了如何通过链表实现约瑟夫问题,包括创建带环链表、计数报数并销毁节点的过程。通过这个题目,读者能巩固链表知识并了解不同解决方案。
摘要由CSDN通过智能技术生成

前言:

        约瑟夫问题是一个很经典的问题,当我们学习完链表的知识,写这道题可以加深我们对链表的理解,也会对链表的知识有一个巩固的作用,接下来就让我们来写一下这道题

牛客链接:环形链表的约瑟夫问题_牛客题霸_牛客网

1.大体思路:

通读题目,我们可以有一些大体的思路,从1-n围成一圈,那么也就是说我们要创建一个带环链表,最后只剩下一个人,那么也就是说最后链表自己指向自己,接下来让我们来画图分析一下!

接下来让我们来实现一下:

2.实现

2.1 创建带环链表

我们要创建一个带环的链表,那么也就是说我们需要链表的尾节点的下一个要指向我们的头节点,这样就可以循环起来了,我们需要使用malloc动态开辟内存!

2.2实现计数,报数到m就销毁 

3.整体代码 

typedef struct ListNode ListNode;
 ListNode* buy_node(int n)
 {
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->val = n;
    node->next = NULL;
    return node;
 }
 ListNode* createbandlist(int n)
 {
    ListNode* phead = buy_node(1);
    ListNode* patil = phead;
    for(int i=2; i<=n; i++ )
    {
        patil->next = buy_node(i);
        patil = patil->next;
    }
    patil->next = phead;
    return patil;
 }
 
int ysf(int n, int m ) {
    //封装一个函数实现创建带坏链表
   ListNode* perv = createbandlist(n);
   ListNode* pcur = perv->next;
   int count = 1;//计数
   while(pcur->next != pcur)
   {
        if(count == m)
        {
            //杀掉
            perv->next = pcur->next;
            free(pcur);
            pcur = perv->next;
            count = 1;
        }
        else {
        {
            //继续计数
            perv = pcur;
            pcur = pcur->next;
            count++;
        }
        }
   }
   return pcur->val;
}

结语:

        当我们写完这个题目,会对链表的使用更加熟悉,有利于我们更加深入学习,当然了这个问题可以使用数组去解决,会很多办法可以实现约瑟夫问题,希望这边博客对大家有帮助,大佬互三 !

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值