大家有没有听过约瑟夫环这个问题呢?我们先来看看它是一个什么样的问题~
约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Flavius Josephus)提出的。该问题的说法不一,传说他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫就想出来一个方法。
现在房间内共有n个人,将按下面的规则去杀人:
1、所有的人围成一圈;
2、顺时针报数,每次报到q的人将被杀掉;
3、 被杀掉的人将从房间内移走;
4、然后从被杀掉的下一个人重新报数,直到剩余一人。
最终聪明的约瑟夫活了下来。
这就是著名的约瑟夫环问题。
下面我们来看一下这个问题是如何拿链表实现的呢?
下面我们就用代码实现一下吧~我们只写约瑟夫环这一部分,链表插删等操作上节中讲过啦!就不重复写了。
pNode JosephCircle(pNode *pHead,int M)
{assert(pHead);pNode pCur = *pHead;pNode pPcur = *pHead;int count = M;if(*pHead == NULL || M <= 0) //边界检测,M指报数的退出号return NULL;while (pCur->next) //找到最后一个节点,使它构成环{pCur = pCur->next;}pCur->next = *pHead;while(pPcur->next != pPcur) {int count = M;while(--count) //报到第M个节点,则删除{pPcur = pPcur->next;}if(pPcur == *pHead){*pHead = (*pHead)->next;}DeleteListNotTail(pHead,pPcur);}return pPcur;
}
返回值就是最后留下的那个人。出函数之后可以取节点的data知道里边的内容。这就是简单的约瑟夫环问题。
点击继续链表题哦>>