算法整理学习(一)
(注,以下算法答案均出自网络,自己整理学习,并非原创)
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; }