题目描述:

输入一个链表,按链表值从尾到头的顺序返回一个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. 从零开始编写IntelliJ IDEA插件

    写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件.要是这个操作是你们的编码环境 ...

  2. 洛谷 P6046 [CTSC2000]快乐的蜜月

    先讲解一下如何处理这道题的毒瘤输入.\(m\) 和 \(d\) 之间的"/"和" TO "都可以用 getchar() 强行吃掉,日期的转换可以用公式 \(s_ ...

  3. MySQL实现主从复制功能

    环境说明         centos7.3.MySQL5.7 前言         MySQL安装参考之前的文章https://www.jianshu.com/p/452aa99c7476有讲解. ...

  4. js面试代码中的“坑”

    1.typeof 对类型的判断 (function() { return typeof arguments; } )(); 答案:"Object" 解释:arguments是一个伪 ...

  5. pyhton的返回值

    a=input() input()函数返回的是字符‘2’ a=bin(2) bin函数返回的是二进制形式的字符串'0b10' type()判断类型 bin()转化成二进制 int(a,2)可以强制把字 ...

  6. 首款中文渗透测试专用Linux系统—MagicBox

    1.     MagicBox的介绍 首款中文渗透测试专用Linux系统——MagicBox即将问世,中文名称:“魔方系统”,开发代号:Genesis.第一版本发布时间计划为2012年12月5日 这是 ...

  7. Intent的常用属性action和category

    设置隐式跳转 首先在我们按钮监听器中添加 Intent i=new Intent(); //参数为字符串,可以添加包名.活动名 i.setAction("com.example.aaaaa. ...

  8. markdown基本语法教程

    标题 一级标题 二级标题 三级标题 以此类推,总共六级标题,建议在警号后面加一个空格,这是最标准的markdown语法 列表 在markdown下: 列表的显示只需要在文字前加上-.+或*即可变为无序 ...

  9. c++存储区域

    来自:https://www.cnblogs.com/simonote/articles/3146038.html 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储 ...

  10. 如何反编译MIPS64伪代码?用Ghidra

    在分析固件时,碰到MIPS64架构的程序会很头疼,虽然用IDA能够反编译出汇编代码,但是没办法F5一键反编译成伪代码,如果单看汇编,看久了脑壳痛. 后来Google到了一个好工具,Ghidra,发音和 ...