1.问题:
输入一个链表,从尾到头打印链表每个节点的值。
2,思考:
(1),笨方法:
从头到尾扫描一遍,改变next指针,变成逆向。
再扫描一遍改变后的链表,把值放入一个vector中,返回。
(2),既然是从尾到头输出,即逆序输出,即从底到上输出,而递归恰好有自底至上的性质,适应这里。
3,在牛客网上的编码为:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> vec;
vector<int> printListFromTailToHead(struct ListNode* head) {
//我这笨方法还把head后边的内容变了
//真笨!!!
/*if (head == NULL)
{
vector<int> vec;
return vec;
}
ListNode* pPre = NULL;
ListNode* p = head;
ListNode* pNext = p->next;
int count = 0;
while (p)
{
count++;
p->next = pPre;
pPre = p;
p = pNext;
if (p)
{
pNext = p->next;
}
}
ListNode* newHead = pPre;
vector<int> temp(count);
for (unsigned int i = 0; i < count; i++)
{
temp[i] = newHead->val;
newHead = newHead->next;
}
return temp;*/
//参考牛人代码,利用递归的思想,
//这里相当于逆序输出,而递归也是从底到上的次序返回
//正好合适这里用!
if (head != NULL)
{
if (head->next != NULL)
{
printListFromTailToHead(head->next);
}
vec.push_back(head->val);
}
return vec;
//代码简洁而且空间用的少,思想也好!
}
};
反省:
拿到一个题,先从宏观上把握它的思想,再从细节上考虑!