标签:
<剑指offer第五题>
思路:在不改变链表结构的情况下,要从头到尾扫描链表,然后再从尾到头输出,这是一种“先进后出”的思路。最直观的想法就是利用栈来完成。
vector<int> printListFromTailToHead(struct ListNode* head) { vector<int> result; stack<int> output; while(head) { output.push(head->val); head=head->next; } while(!output.empty()) { int num=output.top(); result.push_back(num); output.pop(); } return result; }
从栈又可以想到递归,因为递归本质上就是一个栈结构。每访问到一个结点时,先输出它后面的结点,再输出结点本身,这样链表的输出结果就反过来了。
但递归的问题就在于,当链表非常长时,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。
void recurse(struct ListNode* head, vector<int> &result){ if(head) { if(head->next) recurse(head->next,result); result.push_back(head->val); } } vector<int> printListFromTailToHead(struct ListNode* head){ vector<int> result; if(head) { recurse(head,result); } return result; }
标签:
原文地址:http://www.cnblogs.com/summerkiki/p/5469987.html