您的位置:首页 > Web前端

剑指offer 从尾到头打印链表

2017-11-09 23:22 351 查看

题目描述

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

思路

总共有五种方法,如下:

1. 将原链表的值存在一个栈中,然后再将栈输出到另一个vector数组里。

2. 直接将原链表的值存在一个vector数组里,最后reverse翻转一下。

3. 每插入一个,都放到最前面,复杂度是n2,不是很高效。

4. 通过递归到最后一个值,再一层一层输入到vector数组里。

5. 直接将链表翻转。

代码

1.

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


3.

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


4.

class Solution {
public:
vector<int> res;
vector<int> printListFromTailToHead(ListNode* head) {
if(head!=NULL){
printListFromTailToHead(head->next);
res.push_back(head->val);
}
return res;
}
};


5.

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表