剑指offer 从尾到头打印链表

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

思路

总共有五种方法,如下:

  1. 将原链表的值存在一个栈中,然后再将栈输出到另一个vector数组里。
  2. 直接将原链表的值存在一个vector数组里,最后reverse翻转一下。
  3. 每插入一个,都放到最前面,复杂度是$n^{2}$,不是很高效。
  4. 通过递归到最后一个值,再一层一层输入到vector数组里。
  5. 直接将链表翻转。

代码

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; } };
2.

```
class Solution {
public:
vector printListFromTailToHead(ListNode* head) {
vector res;
while(head != NULL)
{
res.push_back(head->val);
head = head->next;
}
reverse(res.begin(),res.end());
return res;
}
};

3.
class Solution {
public:
vector printListFromTailToHead(struct ListNode* head) {
vector res;
if(head != NULL)
{
while(head != NULL)
{
res.insert(res.begin(),head->val);
head = head->next;
}
}
return res;
}
};
4.
class Solution {
public:
vector res;
vector printListFromTailToHead(ListNode* head) {
if(head!=NULL){
printListFromTailToHead(head->next);
res.push_back(head->val);
}
return res;
}
};
5.
class Solution {
public:
vector printListFromTailToHead(ListNode* head) {
vector 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;
}
};
```

posted @ 2017-11-09 23:26  云胡同学  阅读(184)  评论(0)    收藏  举报