C::有趣的约瑟夫环
来源:互联网 发布:男科网络咨询说话技巧 编辑:程序博客网 时间:2024/04/26 03:49
关于约瑟夫环有一个有趣的故事:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
当然了,后来我们把它抽象出来,成为著名的约瑟夫环的问题,那么这个问题是怎么解决的呢?别着急,解决步骤如下:
1)先要建立一个有n个节点的链表,把它变成无头节点的循环链表
2)确定从谁开始
3)数到第M个节点,将其删除,循环,直至链表为空
(PS:注意这里我只放了核心实现代码,如果要进行测试的话将我前面的一篇博客关于单链表的实现结合起来,将这两个核心代码放在里面就可以轻松的实现啦,so easy!)
//找尾节点然后将其返回PNode Back(PNode pHead){PNode pTail = pHead;PNode pPreTail = pHead;while(pTail){pPreTail = pTail;pTail = pTail->pNext;}return pPreTail;}//约瑟夫环void JosephCircle(PNode* pHead, int M){int count = 0;PNode pPre = NULL; //要删除的节点的前一个节点PNode pDel = *pHead; //要删除的节点(这里从未创建环时的头节点作为起始)if(*pHead == NULL && M<0){return;}Back(*pHead)->pNext = *pHead; //链接约瑟夫环while(pDel != pDel->pNext){count = M; //M为走到被删除的节点的步数while(--count) //查找要删除的节点{pPre = pDel;pDel = pDel->pNext;}pPre->pNext = pDel->pNext;free(pDel);pDel = pPre->pNext;}pDel->pNext = NULL;*pHead = pDel;}
0 0
- C::有趣的约瑟夫环
- 有趣的约瑟夫环问题
- 约瑟夫环问题的C版本答案
- 约瑟夫环问题的C版本答案
- 关于约瑟夫环的c语言解法
- 约瑟夫环问题(Josephus)的C解法
- 【年少的风】C实现约瑟夫环
- 【年少的风】C实现约瑟夫环
- c语言:约瑟夫环的实现
- c语言下的约瑟夫环
- 有趣的数学问题(约瑟夫环+百钱买百鸡+阶梯数+背包问题+欧几里德算法)
- 有趣的C语言
- c的有趣问题
- C 约瑟夫环
- [c] poj1012 约瑟夫环
- 一段有趣的C程序
- 有趣的C语言基础
- 一道有趣的C語言題目!
- NULL¬ NULL
- android 网络请求获得返回数据(1)
- spring boot 整合 spring security 之使用数据库验证
- android post请求
- DB2 C language external scalar user-defined function
- C::有趣的约瑟夫环
- 最大子矩阵(贪心)
- iOS 10 开发适配系列 之 权限Crash问题
- NOIP2016 总结
- DB2 how to drop overloaded functions
- storm安装
- 【汇编】十以内冒泡排序
- A - 搜索I 简单图论
- 同个电脑多个ssh key的配置使用