约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
///循环链表实现 #include<bits/stdc++.h> using namespace std; typedef struct List { int data; struct List *next; } node; int main() { node *head,*r,*s; head = new node;///带来头结点,不过后面会去掉 r =head; int n,i; int k; cin>>n>>k; ///建立循环链表 for(i = 1; i<=n; i++) { s = new node; s->data = i; r->next = s; r= s; } r->next =head->next;///为节点指向头结点的下一个有数据的结点 node *p,*p1; p = head->next;///去掉头结点 delete head; while(p->next != p)///当链表中只有一个结点时停止 { for(i = 1; i<k-1; i++)///遍历到第k个时停止 { p = p->next; } p1=p->next;///删除该结点 p->next = p->next->next; delete p1; p = p->next; } cout<<p->data<<endl; delete p; return 0; }