问题:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
Note:
反序:先访问的节点后返回——栈特性
所以我们从链表的头结点来迭代的访问下去,直到到最后一个链表的节点,同时不断向栈中push节点,最后将栈不断弹出节点,将节点的val push进结果数组中:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if (head == nullptr || head->next == nullptr) {
return res;
}
ListNode *p = head;
stack<ListNode*> t_stk;
while (p != nullptr) {
t_stk.push(p);
p = p -> next;
}
while (!t_stk.empty()) {
res.push_back(t_stk.top()->val);
t_stk.pop();
}
return res;
}
};
java版:
public class ListNode {
int val;
ListNode next;
ListNode (int val) {
this.val = val; // this是对象自己,
}
}
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode temp = listNode;
while (temp != null) {
list.add(0, temp.val);
temp = temp.next;
}
return list;
}
}
Note:
2.有栈特性的话,也可以使用递归——因为栈本身就是一种递归,见下面的java的递归
public class ListNode {
int val;
ListNode next;
ListNode (int val) {
this.val = val;
}
}
import java.util.ArrayList
public class Solution {
ArrayList<Integer> list = new ArrayList();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if (listNode != null) {
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}