首页 > 代码库 > 用循环单链表实现约瑟夫环
用循环单链表实现约瑟夫环
题目:n个人编号分别是1,2,3,...,n,围坐在一张圆桌周围,从编号为k的人开始报数,数到m的人出列。然后他的下一个人开始报数,数到m的那个人又出列;依次循环,直到所有人出列。
struct LNode{ int data; LNode *next; }; //n为总人数,k为第一个开始报数的人,m为出列者喊到的数 void solve(int k,int m, int n) { if(k>n || n<=0 || m<=0) { throw "Invalid argument(s)"; } //建立循环链表 LNode *p = new LNode; p->data = http://www.mamicode.com/1; p->next = p; LNode *curr = p; for(int i=2;i<=n;i++) { LNode *q = new LNode; q->data =http://www.mamicode.com/ i; p->next = q; q->next = curr; p=p->next; } //把当前指针移动到第一个报数的人 while(--k) { curr = curr->next; } LNode *pre; int m1=m; while(n--) { while(--m1) { pre = curr; curr = curr->next; } m1 = m; cout<<curr->data<<" "; pre->next = curr->next; delete curr; curr = pre->next; } } int main() { solve(2,2,4); return 0; }
注意:while(k--)比while(--k)多循环一次,在循环体中k值大小相同。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。