经典的约瑟夫环问题,用单链表实现竟然这么简单!?

目录

前言

问题

思路

代码


前言

这两天想到了之前自己用数组实现约瑟夫环问题时写了好多的代码,然后想到数据结构中的但链表好像也可以实现,于是去实践了一下,发现果然可以实现,而且还代码还简洁明了不少。

问题

使用单链表实现约瑟夫环(JosephCircle)问题。(约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又出列;依此规律重复下去,直到圆桌周围的人只剩下一个人。)

//链表节点声明
struct ListNode
{int m_nKey;ListNode * m_pNext;
};
//题目:使用链表实现约瑟夫环(JosephCircle)问题。
ListNode* JosephCircle(ListNode* pHead, unsigned int k)
{}

思路

首先我们需要构建一个环,用一个节点pCur变量遍历到链表的尾节点,然后将pCur的指针域指向头节点,这样我们的环就构建完成了。

然后我们将头节点赋值给pCur,用pCur节点进行约瑟夫环问题的实现。我们需要使用一个while循环,当pCur的指针域指向的是自己时,说明只剩下了一个人,此时可以跳出循环,否则我们就将k赋值给变量i,i自减一个则pCur偏移到下一节点,当i自减为0时找到要出局的节点,我们就可以删除它,循环往复直到只有一个节点。

跳出循环后记得将此节点的指针域赋空,返回即可。

代码

代码如下:

ListNode* JosephCircle(ListNode* pHead,unsigned int k)
{ListNode* pCur = pHead;                 //构建环while (pCur->m_pNext != NULL){pCur = pCur->m_pNext;}pCur->m_pNext = pHead;pCur = pHead;while (pCur ->m_pNext != pCur) // 只有一个结点时跳出循环{unsigned int i = k;while (--i){pCur = pCur ->m_pNext;}//将后一个结点的数据域和指针域赋值给要删除的结点,删除后一个节点ListNode* pDel = pCur ->m_pNext;pCur ->m_pNext = pDel ->m_pNext;pCur ->m_nKey = pDel->m_nKey;delete pDel ;pDel = NULL;}pCur ->m_pNext = NULL;return pCur;
}

总结

以上就是用单链表实现约瑟夫环问题的全部过程啦,是不是肥常简单!

单链表实现约瑟夫环问题相关推荐

  1. java 单链表约瑟夫环_java循环单链表实现约瑟夫环问题

    package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getData() ...

  2. c语言循环单链表实现约瑟夫环问题

    题目: 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值max,从第一个人开始按顺时针方向自1开始 ...

  3. 单链表实现约瑟夫环(JosephCircle)(C语言)

    //使链表形成一个环 void FormCyc(PSListNode *pHead) {if (NULL == pHead){return;}else{PSListNode pNode = *pHea ...

  4. 第四次博客:循环单链表解决约瑟夫环问题

    #include <stdio.h> #include <stdlib.h> typedef struct aa{  int data;  struct aa *next; } ...

  5. 构造数组MaxTree、环形单链表的约瑟夫问题等总结

    1.构造数组的MaxTree 定义二叉树节点如下: public class Node{ public int value; public Node left; public Node right; ...

  6. 判断单链表是否存在环

    周末参加完美世界校园招聘中就有一道判断单链表是否有环的编程题. 写一个C/C++函数,来判断一个单链表是否具有环,如果存在环,则给出环的入口点. 有一个单链表,其中可能有一个环,也就是某个节点的nex ...

  7. 左神算法:环形单链表的约瑟夫问题(Java版)

    本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...

  8. 【数据结构与算法】判断单链表是否有环的算法

    带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...

  9. 用链表实现约瑟夫环(没用)

    用链表实现约瑟夫环 Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这 ...

最新文章

  1. RPC 笔记(07)— socket 通信(多进程服务器)
  2. jQuery.append()、jQuery.html()存在的XSS漏洞
  3. linux shell 去掉 文本换行符
  4. plsql的安装与部署
  5. nginx+tomcat+resin+jdk一键自动化安装脚本(4--resin安装脚本)
  6. redis介绍以及使用 ppt_光纤收发器的工作原理以及使用方法介绍
  7. SlopOne推荐算法
  8. couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...
  9. python加载文件并显示文件内容到qtextedit上_如何在python中读取QTextedit?
  10. How MapReduce Works
  11. 最新全套码支付源码/QQ+微信+支付宝三网免挂支付系统源码
  12. 关于QT 报错Error: Class declaration lacks Q_OBJECT macro.
  13. 渗透测试-HTTP Strict Transport Security
  14. 安装gooreplacer插件为含有googlefonts api的网页提速
  15. 《信号与系统》自然/受迫响应、零输入/零状态响应及系统初始状态
  16. 求1-1/2+1/3-1/4+...+1/99-1/100。
  17. 描写火车站场景_形容车站人多的句子(车站场景写一段话)
  18. h3cr4900g3安装系统_H3C服务器安装Windows操作系统
  19. 【冰点】:重庆“高烧”不退
  20. JavaScript练习题# Day03 作业

热门文章

  1. bdd100k数据集制作用于YOLOv3训练
  2. java上传图片限制大小_求高手解决用java限制上传图片大小!!
  3. 移动端上(传图片太大)处理方案
  4. GP技术的展望——先有鸿钧后有天 转自 longshanks
  5. mysql阿里云不显示中文乱码_MySQL命令窗口下中文显示乱码的解决过程
  6. 网页设计 实现读书信息反馈表 适合小白入门 安排
  7. CCIE Routing Switching备考指南2007版
  8. Error retrieving https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.meta; received 404
  9. 信息安全的主要威胁有什么?
  10. 有关cache命中率的问题