题目:
单链表实现约瑟夫环
约瑟夫环:
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;
他的下一个人又从1开始报数,数到m的那个人又出列;
依此规律重复下去,直到圆桌周围的人全部出列
解题思路:
将链表构成一个环,然后开始数数,数到那个数,就删掉,然后继续数,直到剩一个人
代码实现:
SListNode *JosephCycle(SListNode *pFirst, int k)
{
SListNode *pNode = pFirst;
SListNode *p = pFirst;
if (pFirst == NULL)
return NULL;
while (pNode->pNext)
{
pNode = pNode->pNext;
}//找到结尾
pNode->pNext = pFirst; //构成环
//约瑟夫环结束
while (p->pNext != p)
{
int count = k;
while (--count){
p = p->pNext;
}
//替换法删除
SListNode *next = p->pNext;
p->data = next->data;
p->pNext = next->pNext;
free(next);
}
return p;
}