约瑟夫环——围成一圈,定义一个数值K,从任意位置开始计数,每走K步删除当前位置结点,直到剩下最后一个结点,求最后一个结点
//单链表结构以及Find函数参见 2016-1-2 13:56 发表博客
SListNode* Joseph(SListNode *&pos, int K) //约瑟夫环
{
assert(pos);
if (K > 0)
{
SListNode *tmp = pos;
while (1)
{
int count = K;
while (--count)
{
tmp = tmp->next;
}
if (tmp->next == tmp)
return tmp;
SListNode *cur = tmp->next;//删除tmp位置的结点,思路:pos与下一位置结点元素值进行交换后,删除下一结点
DataType Tmpcount = cur->data;
tmp->next = cur->next;
cur->data = tmp->data;
tmp->data = Tmpcount;
free(cur);
}
}
return NULL;
}
void Test7()// Joseph
{
printf("//Test7() Joseph \n");
SListNode *LL = NULL;
PushBack(LL, 1);
PushBack(LL, 2);
PushBack(LL, 3);
PushBack(LL, 4);
PushBack(LL, 5);
PushBack(LL, 6);
PushBack(LL, 7);
Find(LL, 7)->next = Find(LL, 1);
printf("%d\n", Joseph(LL, 3)->data);
}
转载于:https://blog.51cto.com/10739786/1731557