约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题。

  什么是约瑟夫环?

  “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法)

  这道面试题考察了循环链表的“创建”,“遍历”和“删除”。

创建的循环链表的结构图:

解决约瑟夫环问题的过程

C++实现代码如下:

循环链表解决约瑟夫问题

 1 /**循环链表解决约瑟夫环问题
 2  * 问题:约瑟夫环
 3  * 有编号从1到N的N个人坐成一圈报数,从第K个人开始报数,报到M的人出局,
 4  * 下一位再从1开始报数,如此持续,直止剩下一位为止,报告此人的编号X。
 5  * 输入N,K,M,求出X。
 6  */
 7
 8 #include <iostream>
 9 using namespace std;
10
11 struct MyNode
12 {
13     MyNode(int a_data):m_data(a_data),m_pNext(NULL) {}
14
15     int    m_data;
16     MyNode *m_pNext;
17 };
18
19 class Josephus
20 {
21 public:
22     Josephus(int a_N, int a_K, int a_M):m_N(a_N),m_K(a_K),m_M(a_M)
23     {
24         createList();
25         outputList();
26     }
27
28 protected:
29     void createList();
30     void outputList();
31
32 private:
33     MyNode *m_pHead;//循环链表的头节点
34     int    m_N;     //链表节点个数
35     int    m_K;     //第一个报数人的序号
36     int    m_M;     //报数出局的数
37 };
38
39 void Josephus::createList()
40 {
41     MyNode *pre = NULL;
42     MyNode *cur = NULL;
43     MyNode *p = new MyNode(1);
44     m_pHead = p;
45     cur = p;
46     for (int i=2; i<=m_N; i++)
47     {
48         p = new MyNode(i);
49         pre = cur;
50         cur = p;
51         pre->m_pNext = cur;
52     }
53     cur->m_pNext = m_pHead;
54
55     int n=m_N;
56     p = m_pHead;
57     while (n--)
58     {
59         cout << p->m_data << ",";
60         p = p->m_pNext;
61     }
62     cout << endl;
63 }
64
65 void Josephus::outputList()
66 {
67     MyNode *pre = NULL;
68     MyNode *cur = m_pHead;
69     m_K--;
70     while (m_K--)            //寻找第K个人(开始报数的人)
71     {
72         pre = cur;
73         cur = cur->m_pNext;
74     }
75     while (m_N--)            //输出链表中所有的节点值
76     {
77         int s = m_M-1;
78         while (s--)            //寻找间隔M的人
79         {
80             pre = cur;
81             cur = cur->m_pNext;
82         }
83         MyNode *p = cur;
84         cout << p->m_data << ",";
85         cur = cur->m_pNext;    //删除节点的过程
86         pre->m_pNext = cur;
87         delete p;
88         p=NULL;
89     }
90 }
91
92 int main()
93 {
94     Josephus josephus(100,5,5);
95     return 0;
96 }

测试结果:

转载于:https://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html

循环链表解决约瑟夫环问题相关推荐

  1. 【C语言】循环链表解决约瑟夫环问题

    好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列:每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的 ...

  2. 使用循环链表解决约瑟夫环问题

    1.问题来源: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一 ...

  3. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  4. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题

    约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...

  5. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  6. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  7. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  8. C语言使用数组和循环解决约瑟夫环问题

    C语言使用数组和循环解决约瑟夫环问题 约瑟夫入狱,监狱内共有 33 个犯人.某日 33 名犯人围成一圈,从第一个犯人开始报数,报到数字 7 的犯人出列, 被枪毙,下一名犯人重新从 1 开始报数.依次类 ...

  9. 循环链表构建及解决约瑟夫环、逢七过、链表逆置问题

    文章目录 循环链表构建 测试 约瑟夫环 逢七过 链表逆置 循环链表构建 循环链表与链表区别就在于尾指针不再指向null而是指向头指针,形成环. 接口定义: package p1.接口;import j ...

最新文章

  1. 基于Yolo-V3对卫星图像进行储油罐容积占用率的研究
  2. STM32-USART控制led和蜂鸣器
  3. NLP-基础知识-007(机器学习-朴素贝叶斯)
  4. 计算机网络教室课程安排表,关于计算机教学计划汇总六篇
  5. 鸿蒙开发-使用fetch发起网络请求
  6. sqlserver表分区
  7. 自动化测试工具selenium使用介绍
  8. android 音乐播放器的状态栏通知,Android仿虾米音乐播放器之通知栏notification解析...
  9. mysql排序行号_mysql 取得行号后再排序
  10. 浮动元素 —— 怎么使用它们、它们有什么问题以及怎么解决这些问题。
  11. Elasticsearch集群监控工具bigdesk插件安装
  12. JS - this,call,apply
  13. 前牙正常覆盖是多少_深覆合和深覆盖两者怎么区分?花两分钟进来了解一下
  14. 数据库TCPIP协议开了,但还是远程连不上
  15. IP 点分十进制表示法
  16. 精讲设计模式-Builder模式
  17. 国二c语言和南开100题,全国计算机二级C语言题库_南开100题.doc
  18. Matlab GUI的文件打开和保存uigetfile uigetdir
  19. 嵌入式(单片机方向)工程师如何做好定位和职业规划
  20. Tom猫爱吃喝_Python面向对象“又“入门

热门文章

  1. linux1到10累加,10个有趣的 Linux 命令
  2. 『ACM-数据结构』信息竞赛进阶指南--线段树
  3. 数学--数论--二次探测定理
  4. T1串口波特率的计算方法
  5. SMT精密电阻对照表
  6. 支持分布式数据库同步操作的一个设计点:主键问题
  7. servlet版本及容器和Java版本
  8. 总体方差的充分统计量_R方是否衡量预测能力或统计充分性?
  9. 大数据技术 学习之旅_数据-数据科学之旅的起点
  10. Markdown 图标 快捷键