题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
自己的思路
首先去建立这个链表,再将链表入栈,再出栈,即完成逆序打印链表。最开始没有考虑清楚,这个链表使用了结构体,因此我的栈则不能是存放int类型,那样会很麻烦,而是直接将链表的每个struct压栈,打印的时候只需要求出每个struct对应的val值即可。哎,还是太naive了,题目的考察目的是让你去逆序输出这个链表,而不需要自己去建立这个链表,无形中给自己增加了苦难,而且判断条件容易写错,造成数组越界的错误,考试就没这个时间去调试了。其次,题目要求返回的是一个vector,话说你的vector呢,会a才怪。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
std::stack<ListNode*> stk; //开始用stack<int> stk,一直报类型不匹配,别人head里面是一个struct
int temp;
while(cin >>temp){ //多余的考虑
head->val = temp;
stk.push(head);
head = head->next; //堆栈溢出
}
while(!stk.empty()){
cout << stk.top()->val << endl;
stk.pop();
}
}
};
通过修改后的代码
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
std::stack<ListNode*> stk;
ListNode* node = head;
while(node != nullptr){
stk.push(node);
node = node->next;
}
vector<int> result; //通过入栈,再出栈到vector中,就完成了逆序
while(!stk.empty()){
result.push_back(stk.top()->val);
stk.pop();
}
return result;
}
};
大佬的思路
递归进行倒序打印,即想打印第一个就需要打印第二个,以此类推直到最后一个数据先打印出来,再返回去打印之前的数据(感觉优秀的代码都是用的递归,无奈,自己不熟啊。)。采用递归注意出口条件:该节点和下一个节点是否为空。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
ListNode* p=head; //每次递归时,它都指向p->next
if(p!=NULL){
if(p->next!=NULL){ //注意递归的出口条件,这也是递归的关键点
printListFromTailToHead(p->next);
}
result.push_back(p->val); //若p->next为空,说明是链表尾了
}
return result;
}
};