原理:
- 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时把编号从0~n-1,最后结果+1即为原问题的解。(约瑟夫环 - 搜狗百科)
代码:
pNode JosephCircle(pList * pplist, const int M)
{
pNode pCur = NULL;
pNode pDel = NULL;
assert(pplist);
if (*pplist == NULL)
{
return NULL;
}
while (pCur->next != pCur)//不是一个结点
{
//报数
int count = M;
while (--count)
{
pCur = pCur->next;
}
//删结点--替换法删除
pDel = pCur->next;
pCur->data = pDel->data;
pCur->next = pDel->next;
free(pDel);
pDel = NULL;
}
//此时只剩一个结点
*pplist = pCur;
return *pplist;
}