链表OJ—环形链表的约瑟夫问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

1、环形链表的约瑟夫题目:

著名的Josephus问题

据说著名犹太 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

代码演示:

cs 复制代码
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
 typedef struct ListNode ListNode;
 //申请一个新的节点
 ListNode*ListBuyNode(int x)
 {
    ListNode*node = (ListNode*)malloc(sizeof(ListNode));
    if(node == NULL)
    {
        perror("malloc fail!");
        exit(1);
    }
    node->val = x;
    node->next = NULL;
    return node;
 }
 //创建带环链表
 ListNode*Greatelist(int n)
 {
    //创建链表
    ListNode*phead = ListBuyNode(1);
    ListNode*pTail = phead;
    for(int i=2;i<=n;i++)
    {
        ListNode*node = ListBuyNode(i);
        pTail->next = node;
        pTail = pTail->next;
    }
    //以上只是在创建单链表
    pTail->next = phead;
    return pTail;//有尾节点就能找到头节点,返回头节点的话还要遍历链表才能找到尾节点
 }
 //n:一共有几个人参加游戏
 //m:报数到m的人,自杀(节点释放)
int ysf(int n, int m ) {
    // 创建不带头的单向循环链表
    ListNode*prev = Greatelist(n);
    //对该链表进行约瑟夫游戏
    ListNode*cur = prev->next;//就是头节点
    int count = 1;//从1开始报数
    while(cur->next!=cur)
    {
        if(count == m)
        {
            //删除节点
            //前一个节点指向大后面的节点
            prev->next = cur->next;
            free(cur);
            cur = prev->next;
            count = 1;//从新开始从1报数
        }
        else {
        //继续往下报数
        prev = cur;
        cur = cur->next;
        count++;
        }
    }
    //此链表中只有一个节点
    return cur->val;
}

总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

相关推荐
qq_4112624232 分钟前
为什么会“偶发 539/500 与建连失败”
服务器·c语言·网络·智能路由器
scx2013100435 分钟前
20250822 组题总结
c++·算法
Jenkinscao39 分钟前
我从零开始学习C语言(13)- 循环语句 PART2
c语言·开发语言·学习
智驱力人工智能1 小时前
智慧工厂烟雾检测:全场景覆盖与精准防控
人工智能·算法·安全·智慧城市·烟雾检测·明火检测·安全生产
白书宇1 小时前
12.从零开始写LINUX内核--控制台初始化
linux·c语言·驱动开发·嵌入式硬件·microsoft·iot
我是一只菜菜1 小时前
中国大学MOOC--C语言第十一周结构类型
c语言·开发语言
浩少7023 小时前
LeetCode-17day:贪心算法
算法·leetcode·贪心算法
mashanshui7 小时前
Https之(二)TLS的DH密钥协商算法
算法·https·tls·dh·ecdhe
wearegogog12310 小时前
MATLAB的脉搏信号分析预处理
算法·matlab
fs哆哆10 小时前
在VB.net中一维数组,与VBA有什么区别
java·开发语言·数据结构·算法·.net