链表面试题之约瑟夫环问题
面试题,链表,约瑟夫环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); }