算法原理
约瑟夫环运作如下:
1、一群人围在一起坐成
[2]
环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列
[3]
,约瑟夫环结束
下来我们用单链表来实现约瑟夫环: 解决思路: 首先单链表本身不是一个环,所以第一步要构环,第二步实现报数,第三步将报到某个数的节点删除,直到环中剩下一个节点或者没有节点为止,第三步解环。看代码;
//单链表实现约瑟夫环
void Josephcricle(PNode* ppHead, int M){
assert(ppHead);
if (NULL== *ppHead){
return;
}
circle(*ppHead);//构环
PNode pcurnode = *ppHead;
while (pcurnode->_pNext != pcurnode){
int count = M;
while (--count){
pcurnode = pcurnode->_pNext;
}
PNode pdelnode = pcurnode->_pNext;
pcurnode->_data = pdelnode->_data;
pcurnode->_pNext = pdelnode->_pNext;
free(pdelnode);
}
pcurnode->_pNext = NULL;//解环
*ppHead = pcurnode;
}