题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例:
输入:head = [1,3,2]
输出:[2,3,1]
思想1: 利用栈先进后出的特性来实现
- 把数据push_back()放入栈中,再pop()出来到数组。
- 返回数组即可。
代码1:
//1.利用栈
vector<int> printListFromTailToHead(ListNode* head)
{
vector<int> ar;
stack <int> stk;
while(head!=NULL)
{
stk.push(head->val);
head=head->next;
}
while(!stk.empty())
{
ar.push_back(stk.top());//top得到栈顶元素
stk.pop();//pop删除
}
return ar;
}
思想2: 数组逆置,直接用系统自带的函数或者自己写都可以。
代码2:
vector<int> printListFromTailToHead1(ListNode* head)
{
vector<int>ar;
while(head!=NULL)
{
ar.push_back(head->val);
head=head->next;
}
//reverse(ar.begin(),ar.end());系统自带
int j=ar.size()-1;//下标从0开始的
int temp=0;
for(int i=0;i<j;i++)
{
temp=ar[i];
ar[i]=ar[j];
ar[j]=temp;
j--;
}
return ar;
}
思想3: 递归。
- 从第一个开始递归,一直往后走,直到最后一个退出。
- 退出后把数据放到数组中。
举例:
代码3:
vector<int>ar;//必须开辟到外面,不然递归层次过深,导致溢出
vector<int> printListFromTailToHead2(ListNode* head)
{
if(head!=NULL)
{
if(head->next!=NULL)
{
printListFromTailToHead2(head->next);
}
ar.push_back(head->val);
}
return ar;
}
加油哦!🙆♀️。