一、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
用C语言实现:
void PrintListFromTail2Head(PNode pHead)
{
if (pHead)
{
PrintListFromTail2Head(pHead->_pNext);
printf("%d", pHead->_data);
}
}

用c++实现:
1、借助栈的特性:后进先出
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
# include<stack>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector <int> result;
stack<int> arr;
ListNode* p=head;
while(p!=NULL)
{
arr.push(p->val);
p=p->next;
}
int len=arr.size();
for(int i=0;i<len;i++)
{
result.push_back(arr.top());
arr.pop();
}
return result;
}
};

二、输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
TreeNode* ConstructCore(int* preStart,int* preEnd,int* vinStart,int* vinEnd)
{
int rootValue = preStart[0];
TreeNode* root = new TreeNode(preStart[0]);
root->val = rootValue;
root->left = nullptr;
root->right = nullptr;
if(preStart == preEnd)
{
if(vinStart == vinEnd && *preStart == *vinStart)
return root;
//else
//throw std::exception("Invalid input");
}
int *rootVin = vinStart;
while(rootVin <= vinEnd && *rootVin != rootValue)
++rootVin;
//if(rootVin == vinEnd && *rootVin != rootValue)
//throw std::exception("Invalid input");
int leftLength = rootVin - vinStart;
int* preLeftEnd = preStart + leftLength;
if(leftLength > 0)
{
//构建左子树
root->left = ConstructCore(preStart+1,preLeftEnd,vinStart,rootVin - 1);
}
if(leftLength < preEnd - preStart)
{
//构建右子树
root->right = ConstructCore(preLeftEnd + 1,preEnd,rootVin + 1,vinEnd);
}
return root;
}
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size() == 0 || vin.size() == 0)
return nullptr;
int *preStart = &pre[0];
int *preEnd = &pre[pre.size() - 1];
int *vinStart = &vin[0];
int *vinEnd = &vin[vin.size() - 1];
return ConstructCore(preStart,preEnd,vinStart,vinEnd);
}
};
