算法整理学习(一)

(注,以下算法答案均出自网络,自己整理学习,并非原创)

1.链表反转

1》递归版本

template<typename T>
ListNode<T>* reverse_slist_recursive(ListNode<T>* head)
{
    if (!head||!(head->next)) return head;

    ListNode<T>* rtn = reverse_list(head->next);

    head->next->next = head;
    head->next = NULL;

    return rtn;
}

 

 

2》利用循环

template<typename T>
ListNode<T>* reverse_slist_common(ListNode<T>* head)
{
    if (!head||!(head->next)) return head;
    
    ListNode<T> * prev=0;

    while (head)
    {
        ListNode<T> * temp = head;
        head = head->next;
        temp->next = prev;
        prev = temp;
    }

    return prev;
}

3》利用辅助栈

template<typename T>
ListNode<T>* reverse_slist_usingstack(ListNode<T>* head)
{
    if (!head||!(head->next)) return head;

    ListNode<T> *prev=0, *pcur=0;
    
    stack<ListNode<T>*> sl;

    while (head)
    {
        sl.push(head);
        head = head->next;
    }

    head = pcur = sl.pop();

    while (!sl.empty())
    {
        prev = sl.pop();
        pcur->next = prev;
        pcur = prev;
    }

    pcur->next = 0;

    return head;
}

2.题目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。

#include <iostream>

using namespace std;

template<int N>
struct CalCls
{
    enum {sum = CalCls<N-1>::sum + N};
};

template<>
struct CalCls<0>
{    
    enum {sum = 0};
};


int main()
{
    cout<<"1+2+3+...+100 = "<<CalCls<100>::sum<<endl;
    return 0;
}

 

 

 

 

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