题目描述
输入一个链表,从尾到头打印链表每个节点的值。
思路
总共有五种方法,如下:
- 将原链表的值存在一个栈中,然后再将栈输出到另一个vector数组里。
- 直接将原链表的值存在一个vector数组里,最后reverse翻转一下。
- 每插入一个,都放到最前面,复杂度是$n^{2}$,不是很高效。
- 通过递归到最后一个值,再一层一层输入到vector数组里。
- 直接将链表翻转。
代码
class Solution {
public:
vector<int>printListFromTailToHead(ListNode*head) {
int digit;
stack<int> f;
vector<int> res;
ListNode *t = head;
while(t != NULL)
{
f.push(t->val);
t = t->next;
}
while(!f.empty())
{
digit = f.top();
f.pop();
res.push_back(digit);
}
return res;
}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
while(head != NULL)
{
res.push_back(head->val);
head = head->next;
}
reverse(res.begin(),res.end());
return res;
}
};
class Solution {
public:
vector<int> printListFromTailToHead(struct ListNode* head) {
vector<int> res;
if(head != NULL)
{
while(head != NULL)
{
res.insert(res.begin(),head->val);
head = head->next;
}
}
return res;
}
};
class Solution {
public:
vector<int> res;
vector<int> printListFromTailToHead(ListNode* head) {
if(head!=NULL){
printListFromTailToHead(head->next);
res.push_back(head->val);
}
return res;
}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
ListNode *pre = NULL;
ListNode *p = NULL;
while(head != NULL)
{
p = head->next; //p为head的下一个节点
head->next = pre;//指向前一个节点
pre = head;//向后移动
head = p;//向后移动
}
while(pre != NULL)
{
res.push_back(pre->val);
pre = pre->next;
}
return res;
}
};