题目描述:

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList,例如按照链表顺序,1->2->3->4->5->6->7->8,那么我们将得到{8,7,6,5,4,3,2,1}

题目分析:

对于单向链表我们知道,一个值与下一个值一一连接,而将值反向输出,我们可以用一个容器存起来,然后反向遍历输出结果,不过我们有一个更好的容器可以实现这一功能,那就是栈,栈具有先入后出的特点,所以我们将链表的值通过栈存起来,然后弹出就是我们需要的结果

下面是代码:

  1. #include <iostream>
  2. #include<vector>
  3. #include<stack>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. struct ListNode {
  8. int value;
  9. struct ListNode *next;
  10. ListNode(int x) :
  11. value(x), next(NULL) {
  12. }
  13. };
  14.  
  15. vector<int> AlterLinkNode(ListNode* head) {
  16. vector<int> result;
  17. stack<ListNode*> arr;
  18. ListNode *p = head;
  19. while (p!=NULL) {
  20. arr.push(p);
  21. p = p->next;
  22. }
  23. while (!arr.empty()) {
  24. result.push_back((arr.top())->value);
  25. arr.pop();
  26. }
  27. }

或者我们还可以采用向量插入的特性实现反向输出

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. struct ListNode{
  6. int value;
  7. struct ListNode* next;
  8. ListNode(int x):value(x),next(NULL){}
  9. };
  10.  
  11. def AlterLinkNode(ListNode* head){
  12. if(head==NULL)
  13. return false;
  14. ListNode *p=head;
  15. vector<int> result;
  16. while(p!=NULL){
  17. result.insert(p->value,p.begin());
  18. p = p->next;
  19. }
  20. return result;
  21. }

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回

题目分析:

首先简单回顾一下前序遍历,中序遍历和后序遍历的特点,前序遍历可以分成{根节点,左子树,右子树},而中序遍历可以分成{左子树,根节点,右子树},后序遍历可以分成{左子树,右子树,根节点},根据前序遍历的特点,我们知道第一个值必定为根节点,以前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}为例,1为初始根节点,通过查找中序遍历,我们可以划分出中序遍历的左子树{4,7,2},右子树{5,3,8,6},对应的前序遍历的左子树为{2,4,7},右子树为{3,5,6,8},接着,我们需要确定原二叉树的左子树,所以我们将前序遍历的左子树与中序遍历的左子树重新送入这个重建二叉树函数,递归算法得到左子树分布,同样的前序遍历的右子树与中序遍历的右子树重新送入重建二叉树函数,递归算法得到右子树分布,到此程序流程结束。

下面是代码:

  1. struct TreeNode {
  2. int val;
  3. TreeNode *left;
  4. TreeNode *right;
  5. TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  6. };
  7. class Solution {
  8. public:
  9. TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
  10. if(pre.size()<=0)
  11. return NULL;
  12. TreeNode* root = new TreeNode(pre[0]);
  13. for(int i=0;i<pre.size();i++){
  14. if(vin[i]==pre[0]){
  15. root->left = reConstructBinaryTree(vector<int>(pre.begin()+1,pre.begin()+i+1),vector<int>(vin.begin(),vin.begin()+i));
  16. root->right = reConstructBinaryTree(vector<int>(pre.begin()+i+1,pre.end()),vector<int>(vin.begin()+i+1,vin.end()));
  17. }
  18. }
  19. return root;
  20. }
  21. };

链表知识点回顾

链表,想象成一串铰链,从头到尾一一连接,一般与数组比较,在插入和删除操作时具有更为快捷的特点,数组需要o(n)的时间,而链表则需要o(1)就可以实现,我们采用结构体实现这一结构,如下所示,为单向链表,第一个数具有值value和next这两个属性,后置是与下一个链表相连的重要依据,初始化我们将next置空

  1. struct ListNode {
  2. int value;
  3. struct ListNode *next;
  4. };

链表插入操作,我们令原来p节点下一个是m节点,那么会有等式m = p->next,那么我们想要插入节点node,注意,只有一种顺序,首先node->next = m,然后p->next = node,然后我们将m替换为p->next插入就完成了,那为什么不能先p->next = node,然后node->next = m呢,因为这样会导致m地址丢失

  1. void InsertNode(ListNode*p,int target) {
  2. ListNode *node = new ListNode;
  3. node->value = target;
  4. node->next = p->next;
  5. p->next = node;
  6. }

链表删除操作

  1. void DeleteNode(ListNode*p) {
  2. p->value = p->next->value;
  3. p->next = p->next->next;
  4. }

参考:

https://www.cnblogs.com/byonecry/p/4458821.html

剑指offer系列(六)的更多相关文章

  1. 剑指offer第六章

    剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...

  2. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  3. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

  4. 剑指offer系列28--字符流中第一个不重复的字符

    [题目]请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”.当从该字符流中读出前六个字符“google”时,第一个只出现 ...

  5. 剑指offer系列26--正则表达式匹配

    [题目]请实现一个函数用来匹配包括’.’和’*‘的正则表达式.模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例 ...

  6. 剑指offer系列62---两个链表的公共结点

    [题目]输入两个链表,找出它们的第一个公共结点. * [思路]1 获取两链表的长度: * 2 让长的链表先走n步后此时走到短链表起始位置: * 3 两链表同时遍历,直至相同,这时返回第一个公共结点. ...

  7. 剑指offer系列61---数组中的逆序对

    [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...

  8. 剑指offer系列60---第一个只出现一次的字符

    [题目]在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置. * 若为空串,返回-1.位置索引从0开始 * [思路]1 首先遍历字符串数组,添 ...

  9. 剑指offer系列59---寻找丑数

    [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...

随机推荐

  1. 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)

    题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...

  2. [HNOI 2017]大佬

    Description 题库链接 题意简述来自Gypsophila. 你现在要怼 \(m\) 个大佬,第 \(i\) 个大佬的自信值是 \(C_i\) .每次怼大佬之前,你的自信值是 \(mc\),等 ...

  3. Redis的安装配置及简单集群部署

    最近针对中铁一局项目,跟事业部讨论之后需要我们的KF平台能够接入一些开源的数据库,于是这两天研究了一下Redis的原理. 1. Redis的数据存储原理及简述 1.1Redis简述 Redis是一个基 ...

  4. 转:Entity Framework 5.0 Code First全面学习

    Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...

  5. 137、Java内部类之把内部类放到外部

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...

  6. 记录:一次使用私有LoadBalance provider,工具metallb的故障排除

    使用metallb工具,目的是为私有环境下,不借助GRE或Azure等云商的LB, 通过metallb-system工具IP池给k8s service提供external-ip.但是,由于设置meta ...

  7. 应用内打开AppStore上某个应用的下载界面--SKStoreReviewController的使用

    产品设计要求是这样的: 对应的初步代码是这样的: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after ...

  8. 三 SprigMvc与Mybatis整合&实现商品列表功能

    思路: Dao层: 1 逆向工程生成mapper及其配置文件以及pojo 2 SqlMapConfig.xml,空文件即可,需要文件头 3 applicationContext-dao.xml a 数 ...

  9. Python作业篇 day03

    ###一.有变量name = 'aleX leNb',完成如下的操作 name = 'aleX leNb' name1 = ' aleX leNb ' #1.移除name1 变量对应的值两边的空格 , ...

  10. Intend之Date的几个功能

    封装为一个方法 1.跳转到拨号页面 //跳转到拨号页面的方法 protected void takeCall(String info){ Intent intent=new Intent(); int ...