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

算法原理

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


猜你喜欢

转载自blog.csdn.net/superwangxinrui/article/details/79793195