约瑟夫环运作如下:
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
下来我们用单链表来实现约瑟夫环:
解决思路: 首先单链表本身不是一个环,所以第一步要构环,第二步实现报数,第三步将报到某个数的节点删除,直到环中剩下一个节点或者没有节点为止,第三步解环。看代码;
//单链表实现约瑟夫环 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; }