从尾到头打印链表
从尾到头打印链表
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
版本一: 没什么技术含量, 利用vector数组简单交换头尾数子
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ret;
ListNode *current = head;
int low = 0;
int high = 0;
if (NULL == head) {
return ret;
}
while (NULL != current) {
ret.push_back(current->val);
current = current->next;
}
high = ret.size() - 1;
while (low < high) {
ret[low] = ret[low] + ret[high];
ret[high] = ret[low] - ret[high];
ret[low] = ret[low] - ret[high];
low++;
high--;
}
return ret;
}
};
版本二: 利用栈的先进后出的思想来交换头尾数字
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> sk;
vector<int> ret;
ListNode *current = head;
while(NULL == head) {
return ret;
}
while(NULL != current) {
sk.push(current->val);
current = current->next;
}
while(!sk.empty()) {
ret.push_back(sk.top());
sk.pop();
}
return ret;
}
};
版本三: 利用递归, 源自牛客网
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> dev;
vector<int> printListFromTailToHead(ListNode* head) {
if(head!=NULL) {
if(head->next!=NULL) {
dev=printListFromTailToHead(head->next);
}
dev.push_back(head->val);
}
return dev;
}
};
版本四: 自己在vs上写的, 不知道为何提交到牛客上不能通过
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
};
vector<int> ret;
vector<int> printArray(ListNode* head, vector<int> &v) {
if (NULL != head->next) {
v = printArray(head->next, v);
}
v.push_back(head->val);
//cout << head->val << endl;
return v;
}
vector<int>& printListFromTailToHead(ListNode* head) {
ret = printArray(head, ret);
return ret;
}
void main(void) {
ListNode n1, n2, n3;
vector<int> ret;
n1.val = 1, n2.val = 2, n3.val = 3;
n1.next = &n2;
n2.next = &n3;
n3.next = NULL;
ret = printListFromTailToHead(&n1);
for (int i = 0; i < ret.size(); i++) {
cout << ret[i] << endl;
}
}