题目:20人从1到20编号围成一圈,从1开始报数,报到2的人出列,剩余的人继续从出列人的下一个人报数,则最后剩下的人的编号为______
解题思路:使用循环链表,实质为循环链表的删除。
看过很多不同的做法,感觉还是这个做法最容易理解,也最容易自己实现。
这里是20个人,不过改成n只需将Initqueue函数引入变量n即可。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int num;
struct Node* next;
}Node;
void InitNode(Node*n)
{
n->next=NULL;
n->num=1;
}
void Initqueue(Node *n)//组件循环链表
{
int i=1;
Node*q=n;
for(i=2;i<=20;i++)
{
Node* p=(Node*)malloc(sizeof(Node));
p->num=i;
q->next=p;
q=p;
}
q->next=n;
}
Node* DeleteNode(Node*n)
{
Node* p=n;
while(p->next!=p)
{
p->next=p->next->next;
p=p->next;
}
return p;
}
int main()
{
Node *n=(Node*)malloc(sizeof(Node));
InitNode(n);
Initqueue(n);
Node* p;
p=DeleteNode(n);
printf("%d",p->num);
return 0;
}