约瑟夫环是什么
单链表实现约瑟夫环
1.把链表构成环
2.如果还剩个数>1:
每前进到第K个结点,删除该结点
//约瑟夫环
SListNode * JocephCircle(SListNode *pFirst, int k)
{
//第一步 ,链表构成环,
SListNode * tail = pFirst;
while (tail->Next != NULL)
{
tail = tail->Next;
}
//tail就是最后一个结点
tail -> Next = pFirst;
//第二步
SListNode* cur = pFirst;
//结束条件是链表中只剩一个结点
while (cur->Next != cur)
{
SListNode *prev = NULL;
for (int i = 0; i < k - 1; i++)
{
prev = cur;
cur = cur->Next;
}
//cur就是要删除的结点了
prev->Next = cur->Next;
free(cur);
//循环继续
cur = prev->Next;
}
cur->Next = NULL;
return cur;
}
测试函数
void TestJocephCircle()
{
SListNode* pFirst = NULL;
for (int i = 1; i <= 7; i++)
{
SListPushBack(&pFirst, i);
}
SListNode * sur = JocephCircle(pFirst,3);
printf("%d\n", sur->data);
}