(1)链表
链表是有指针把若干个节点连接成链状,我们说链表是一种动态数据结构,是因为在链表创建时,无需知道链表的长度,当插入一个新的节点时,我们需要为新的节点分配内存,然后调整指针的指向来确保新节点被链接到链表当中。内存分配不是在创建链表时一次完成的,而是每添加一个节点分配一次内存,由于没有闲置的内存,链表的空间效率比数组要高。
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解题思路:遍历链表,顺序是从头到尾,并把遍历的节点放入栈中,由于栈是典型的"后进先出",所以输出就可以从尾到头了。也可以利用递归的思想来做,但是当链表的长度很长时,就会导致函数调用的层级很深,可能会引起函数调用的栈溢出。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head)
{
std:stack<ListNode*>nodes;
ListNode* pNode = head;
vector<int> res;
while(pNode != nullptr)
{
nodes.push(pNode);
pNode = pNode->next;
}
while(!nodes.empty())
{
pNode = nodes.top();
res.push_back(pNode->val);
nodes.pop();
}
return res;
}
};