经典面试题之单链表实现约瑟夫环(杀人游戏)

算法原理


约瑟夫环运作如下:
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;
}

    原文作者:superwangxinrui
    原文地址: https://blog.csdn.net/superwangxinrui/article/details/79793195
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞