描述
输入一个链表的头节点(不带头结点),按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
解题思路1:
设置计数器,遍历链表得出链表结点个数,然后创建相同空间大小的数组。然后重新遍历链表,按从后往前的顺序将链表结点中的数据放入数组中,然后返回数组。
代码:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
ListNode *p = head;
int len = 0;
while(p)
{
p = p->next;
len++; //得出链表中结点的个数
}
vector<int> a(len); //创建出与结点个数大小相同的数组
p = head;
for(int i = 0;i < len;i++)
{
a[len - i - 1] = p->val; //反着放入数组中
p = p->next;
}
return a;
}
};
解题思路2:
每当遇到反转之类的题时就要想到栈的特性,先进后出,就是反的。于是可以创建一个栈,然后把链表中的结点依次放入到栈中,然后再依次从栈里面取出各个结点中的数据放入数组中,然后返回数组。
代码:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<ListNode*> s; //创建栈
ListNode *L = head;
while(L !=NULL)
{
s.push(L); //进栈
L = L->next;
}
vector<int> a;
while(!s.empty())
{
a.push_back(s.top()->val); //放入数组
s.pop();
}
return a;
}
};