链表面试题之约瑟夫环问题
面试题,链表,约瑟夫环2016-06-23
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
LinkNode *phead;
}LinkList,*pLinkList; pLinkNode JosephCycle(pLinkNode phead,int k) //约瑟夫环问题
{
pLinkNode cur=phead;
pLinkNode del=NULL;
int m=0;
while(1)
{
m=k; //更新m的值,使得k的值可以多次使用
if(cur->next == cur)
break;
while(--m) //cur指向要退出的结点
{
cur=cur->next;
}
printf("del:%d\n",cur->data);
cur->data=cur->next->data; //采用交换的方法
del=cur->next;
cur->next=del->next;
free(del);
del=NULL;
}
return cur;
}void text9()
{
int i=0;
LinkList plist;
pLinkNode ret=NULL;
Init_LinkList(&plist);
//Push_back(&plist,1);
//Push_back(&plist,3);
//Push_back(&plist,5);
//Push_back(&plist,7);
//Push_back(&plist,9);
//Push_back(&plist,11);
for(i=0;i<41;i++)
{
Push_back(&plist,i+1);
}
//构成环
ret=Find_NUM(&plist,i);
ret->next=plist.phead;
ret=JosephCycle(plist.phead,3);
printf("last:%d\n",ret->data);
free(ret);
}