原题:用循环链表求解约瑟夫问题,n 个人围成一个圆圈,首先从第 1 个人开始一个一个地顺时针报数,报到第 m 个人,令其出列。然后再从下一个人开始,从 1 顺时针报数,报到第 m 个人,再令其出列,...... ,如此下去,直到圆圈中只剩下一个人为止。此人即为优胜者。
//分析:用不带头结点的循环链表来表达约瑟夫最简单, p 首先指向要报数到的第 1 个人所在的结点, pre 指向 p 所指结点的前驱,报数时 pre 与 p 依次后移,数到 m-1 时, p 指向第 m 个人,令其出列(即删除 p 所指向的结点),这样列 n-1 个时,圆圈中只剩下一个人。
#include<iostream.h>
typedef struct LNode
{
int data;
LNode *next;
}LNode,*LinkList;
void Josephus(int n,int m)
{
LinkList L=NULL;
LNode *p,*pre;
int i,j;
for(i=1;i<=n;i++)
{
p=new LNode;
p->data=i;
if(!L)
{//当前为空循环链表
L=p;
L->next=L;
}
el