题目:
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
思路:
将n个数字(0,1,…,n-1)形成一个圆圈创建成一个循环链表,一直循环遍历链表,删除第m个数字,
直至剩下一个结点时停止遍历。最后一个结点的data就是剩下最后一个数字。
代码:
#include <Windows.h>
#include <iostream>
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList;
void CreateCircularLinkList(Node* node, int len)
{
Node *s, *r;
int elem = 0;
r = node;
while(elem < len)
{
//建立新结点
s=(Node*)malloc(sizeof(Node));
s->data = elem;
//将s结点插入尾
r->next = s;
r = s;
elem++;
}
r->next = node->next;
}
int Delete_RoundElement(Node *node, int index)
{
if(node == node->next)
{
return node->data;
}
int pace = 1;
Node *p,*s;
p = node->next;
while(p != p->next)
{
pace++;
if(pace == index)
{
s = p->next;
p->next = p->next->next;
free(s);
pace = 0;
}else
{
p = p->next;
}
}
return p->data;
}
int main()
{
int n = 10;
int m = 3;
Node *node;
//0,1,2,…,n-1建立成循环链表
CreateCircularLinkList(node, n);
printf("The last element: %d\n", Delete_RoundElement(node, m));
}