剑指offer 从尾到头打印链表

题目描述

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

思路

总共有五种方法,如下:

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

代码

```

class Solution {
public:
vectorprintListFromTailToHead(ListNode*head) {
int digit;
stack f;
vector 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;
}
};

```

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  云胡同学  阅读(161)  评论(0编辑  收藏  举报