输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
方案1:使用两个vector,一个vector用于在链表遍历的时候存储链表中的val值,然后方向输出值保存到另一个vector中。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
ListNode* p;
p = head;
vector<int> tmp;
while(p != NULL){
tmp.push_back(p->val);
p = p->next;
}
vector<int> result;
// for(int i = 0;i<tmp.size();i++){
// result.push_back(tmp[tmp.size()-i-1]);
//}
for(int i = tmp.size()-1;i>=0;i--){
result.push_back(tmp[i]);
}
return result;
}
};
运行时间:3ms
占用内存:480K
参考链接:https://blog.csdn.net/qq_31442743/article/details/81153874
方案2:
利用栈的先入后出特征,使用一个栈来存储链表中的val值,然后依次出栈保存到vector中。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<int> st;
while(head != NULL){
st.push(head->val);
head = head->next;
}
while(!st.empty()){
result.push_back(st.top());
st.pop();
}
return result;
}
};
运行时间:3ms
占用内存:460K
C++中stack:
- push()会将一个元素放入stack中。
- top()会返回stack中的栈顶元素,返回的是reference,可以就地修改值。
- pop()移除栈顶元素,无返回值。
- size()返回stack长度。
- empty()返回stack是否为空。
参考链接:
http://www.cnblogs.com/liguo-wang/p/9460292.html
https://www.cnblogs.com/ChinaHook/p/6985544.html
方案3:
用递归的方法,递归到最后一个节点,然后开始保存数据。
class Solution {
public:
vector<int> result;
vector<int> printListFromTailToHead(ListNode* head) {
if(head != NULL){
printListFromTailToHead(head->next);
result.push_back(head->val);
}
return result;
}
};
运行时间:3ms
占用内存:504K
参考链接:
https://blog.csdn.net/qq_29519041/article/details/81487151
注意:注意判断条件。