题目:
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
思路:
将n个数字(0,1,…,n-1)形成一个圆圈创建成一个循环链表,一直循环遍历链表,删除第m个数字,
直至剩下一个结点时停止遍历。最后一个结点的data就是剩下最后一个数字。
代码:
#include#include 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)); }