题目描述:

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

题目分析:

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

下面是代码:

#include <iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std; struct ListNode {
int value;
struct ListNode *next;
ListNode(int x) :
value(x), next(NULL) {
}
}; vector<int> AlterLinkNode(ListNode* head) {
vector<int> result;
stack<ListNode*> arr;
ListNode *p = head;
while (p!=NULL) {
arr.push(p);
p = p->next;
}
while (!arr.empty()) {
result.push_back((arr.top())->value);
arr.pop();
}
}

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

#include<iostream>
#include<vector>
using namespace std; struct ListNode{
int value;
struct ListNode* next;
ListNode(int x):value(x),next(NULL){}
}; def AlterLinkNode(ListNode* head){
if(head==NULL)
return false;
ListNode *p=head;
vector<int> result;
while(p!=NULL){
result.insert(p->value,p.begin());
p = p->next;
}
return result;
}

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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},接着,我们需要确定原二叉树的左子树,所以我们将前序遍历的左子树与中序遍历的左子树重新送入这个重建二叉树函数,递归算法得到左子树分布,同样的前序遍历的右子树与中序遍历的右子树重新送入重建二叉树函数,递归算法得到右子树分布,到此程序流程结束。

下面是代码:

struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size()<=0)
return NULL;
TreeNode* root = new TreeNode(pre[0]);
for(int i=0;i<pre.size();i++){
if(vin[i]==pre[0]){
root->left = reConstructBinaryTree(vector<int>(pre.begin()+1,pre.begin()+i+1),vector<int>(vin.begin(),vin.begin()+i));
root->right = reConstructBinaryTree(vector<int>(pre.begin()+i+1,pre.end()),vector<int>(vin.begin()+i+1,vin.end()));
}
}
return root;
}
};

链表知识点回顾

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

struct ListNode {
int value;
struct ListNode *next;
};

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

void InsertNode(ListNode*p,int target) {
ListNode *node = new ListNode;
node->value = target;
node->next = p->next;
p->next = node;
}

链表删除操作

void DeleteNode(ListNode*p) {
p->value = p->next->value;
p->next = p->next->next;
}

参考:

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. Spark教程——(9)Oozie编排Spark任务

    进入Hue管理界面,打开Oozie Editor: 将打包好的Spark程序上传到HDFS上,拖拽Spark任务,编辑任务属性,选择打包好的Spark程序,设置主函数所在类,设置选项参数: 保存为任务 ...

  2. [经验] 关于 Java 中的非空判断

    在写项目的时候, 遇到一个问题 假设有一个控制层接口为: @ResponseBody @RequestMapping(value = "test", method = Reques ...

  3. 「BJOI2018」求和

    「BJOI2018」求和 传送门 观察到 \(k\) 很小而且模数不会变,所以我们直接预处理 \(k\) 取所有值时树上前缀答案,查询的时候差分一下即可. 参考代码: #include <alg ...

  4. JS 循环赋值

    var x_world_map_tiles = 100; var y_world_map_tiles = 100; var world_map_array = []; for (i=0; i<= ...

  5. 129、Java面向对象之static关键字一(修改static变量)

    01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...

  6. 笔记||Python3进阶之读取和写入yaml配置文件

    yaml是专门用来写配置文件的语言,简洁强大,远比JSON格式方便,yaml在python语言中有PyYAML安装包. - 首先需要pip安装:pip install pyyaml - yaml基本语 ...

  7. 一文解读XaaS (转)

    艾克赛斯???别慌,读完你就知道啦~ 服务和云服务 了解Xaas云服务,不妨从了解服务开始. “服务”在本质上是一种租赁,它对资源的占用方式是“为我所用”而非“为我所有”,对资源的消费模式是按需付费而 ...

  8. Redis有序集合类型

    命令 增加元素 ZADD score member [score member ...] > ZADD scoreboard 89 Tom 76 Peter 100 David (integer ...

  9. sklearn中调用集成学习算法

    1.集成学习是指对于同一个基础数据集使用不同的机器学习算法进行训练,最后结合不同的算法给出的意见进行决策,这个方法兼顾了许多算法的"意见",比较全面,因此在机器学习领域也使用地非常 ...

  10. 使用Vue.js 和Chart.js制作绚丽多彩的图表

    前言 深入学习 chart.js 的选项来制作漂亮的图表.交互式图表可以给你的数据可视化提供很酷的展示方式.但是大多数开箱即用的解决方案用默认的选项并不能做出很绚丽的图表. 这篇文章中,我会教你如何自 ...