输入一个链表,按链表值从尾到头的顺序返回一个ArrayList


一、输入一个链表,按链表值从尾到头的顺序返回一个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);
    }
};

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM