算法整理学习(二)
(注:以下算法答案来自网络,自己整理供学习)
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--; } }