Description
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
Solution 1: Recursion
head recursion
//C++
//Time: O(n)
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
helper(res, head);
return res;
}
void helper(vector<int>& res, ListNode* node){
if(NULL == node) return;
helper(res, node->next);
res.push_back(node->val);
}
Solution 2: Stack
用一个Stack来中转。
//C++
//Time: O(n), n为str长度
//Space: O(1)
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> temp;
while(NULL != head){
temp.push(head->val);
head = head->next;
}
vector<int> res;
while(!temp.empty()){
res.push_back(temp.top());
temp.pop();
}
return res;
}
Solution 3: 头插法
可以利用头插法重构链表,不过这个方法会改变List,而且要保证head是reference传进来的,否则会丢失这个List。
//C++
//Time: O(n), n为str长度
//Space: O(1)
vector<int> printListFromTailToHead(ListNode*& head) {
ListNode* nhead = NULL;
while(NULL != head){
ListNode* temp = head -> next;
head ->next = nhead;
nhead = head;
head = temp;
}
head = nhead;
vector<int> res;
while(NULL != nhead){
res.push_back(nhead->val);
nhead = nhead->next;
}
return res;
}