算法整理学习(二)

(注:以下算法答案来自网络,自己整理供学习)

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--;
    }
}

 

 

posted @ 2012-05-01 18:42  suifw  阅读(159)  评论(0编辑  收藏  举报