面试题6:从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
思路1:递归
先递归下一个结点,再打印值,就可以实现逆序了。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> res;
vector<int> printListFromTailToHead(ListNode* head) {
if(head == nullptr)
return res;
printList(head);
return res;
}
void printList(ListNode* head){
if(head == NULL)
return;
printList(head->next);
res.push_back(head->val);
}
};
思路2:栈
栈是先进后出,正好可以解决这个问题
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> res;
vector<int> printListFromTailToHead(ListNode* head) {
if(head == nullptr)
return res;
stack<int> s;
ListNode* cur = head;
while(cur){
s.push(cur->val);
cur = cur->next;
}
while(!s.empty()){
int top = s.top();
s.pop();
res.push_back(top);
}
return res;
}
};
思路3:链表逆序
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> res;
vector<int> printListFromTailToHead(ListNode* head) {
if(head == nullptr)
return res;
//先实现逆序
ListNode* pre = NULL;
ListNode* cur = head;
while(cur){
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
//pre就会变成头结点
while(pre){
res.push_back(pre->val);
pre = pre->next;
}
return res;
}
};