题目描述:
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
这是一道数据结构的题目,我更倾向于使用循环链表解决,每次数到m个位置,就将该节点的序号输出,删除该节点,并重新从1开始计数,以此类推,直到所有人的序号都被输出。
首先建立一个链表:
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
之后初始化该链表,并返回头节点:
LNode *InitLNode(int n)
{
int i;
LNode *head, *bef;//head为头节点,bef为每添加一个结点的前驱结点
head = new LNode;
head->next = NULL;
head->data = 1;
bef = head;
for(i=2; i <= n; i++){
LNode *elem;
elem = new LNode;
elem->data = i;
elem->next = NULL;
bef->next = elem;
bef = bef->next;
}
bef->next = head;//最后将bef指向头节点,就实现了链表的循环
return head;
}
最后遍历链表,每找到第m个位置,就输出该元素的序号并删除结点:
void search(LNode *head, int e)
{
LNode *p = NULL;
LNode *tail = head;
while(tail->next != head)
{
tail = tail->next;
}
p = head;
while(p->next != p){
int i=1;
for(i = 1;i < e; i++){
tail = p;
p = p->next;
}
tail->next = p->next;
cout << p->data << " ";
delete p;
p = tail->next;
}
cout << p->data <<endl;
delete p;
}