(注:以下算法答案来自网络,自己整理供学习)
3.约瑟夫循环报数出列顺序问题
思路:采用循环链表,当然也可以采用数组,像模拟循环队列一样
//方法一: 采用找到一个节点删除一个节点的方式(递归版本) //// template<typename T> void Josephus(ListNode<T>* cur, int N) {int i=1;ListNode<T>* trail=cur;if (cur->next == cur) //如果只剩一个节点,结束递归 {cout<<" "<<cur->data<<"\n\n";delete cur;return;}while (i < N){i++;trail = cur;cur = cur->next;}trail->next=cur->next;cout<<" "<<cur->data<<" >";delete cur;Josephus(trail->next, N); }//方法一: 采用找到一个节点删除一个节点的方式(循环版本) //// template<typename T> void Josephus(ListNode<T>* cur, int N) {int i=1;ListNode<T>* trail=cur;while (cur->next != cur){for (i=1; i<N; i++){trail = cur;cur = cur->next;}trail->next=cur->next;cout<<" "<<cur->data<<" >";delete cur;cur = trail->next;}cout<<" "<<cur->data<<"\n\n";delete cur;}//方法二: 采用找到一个节点标识一个节点的方式 //// template<typename T> void Josephus(ListNode<T>* cur, int cycle, int count) {int i;while (count > 0){while (cur->data == -1) //用-1标示已出列的节点 {cur = cur->next;}for (i=1; i<cycle; i++){cur = cur->next;while (cur->data == -1){cur = cur->next;}}cout<<" "<<cur->data<<" >";cur->data = -1;count--;} }