从尾到头打印链表
思路分析:从尾到头,凡是遇到这种逆序问题,可以先考虑用栈,因为栈是先进后出;也可以考虑使用题归,不过递归确实比较灵活,不好掌握。还有一个比较直观的思路就是先把链表反转,然后再从头到尾打印。
代码:使用栈
1 class Solution{ 2 public: 3 //写函数名呗 4 vector<int> printListFromTailToHead(ListNode* pHead){ 5 //定义一个临时栈 6 stack<int>temp; 7 vector<int>res; 8 //遍历这个列表 9 while(pHead){ 10 temp.push(pHead->val); 11 pHead = pHead->next; 12 } 13 //讲数从栈中弹出 14 while(temp.size()){ 15 res.push_back(temp.top()); 16 temp.pop(); 17 } 18 return res; 19 } 20 };
代码主要还是借鉴别人的,主要还是肚子里没有墨水,经过训练就没有问题。其实思路相当简单,就是能不能在听到题目之后就立即手写出来呢,并且没有bug呢?这才是真整的能力,知识内化了,难道不比脑中没有知识强多了。
思路2:递归实现。
class Solution{ public: //写函数名呗 vector<int> printListFromTailToHead(ListNode* pHead){ //定义一个要返回的数组 vector<int>res; //把握住递归的特点,保留现场,开启新的场景,返回现场。 if(pHead){ val = pHead->val; pHead = pHead->next; res = printListFromTailToHead(pHead); res.push_back(val) } return res; } };
递归,我目前最好的理解就是“保留现场,开启新的现场,回到现场”。比较抽象,递归必须要大量的练习。