题目描述:

输入一个链表,按链表值从尾到头的顺序返回一个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. WebView 设置请求头 Header

    package com.webview.demo; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatAct ...

  2. 监听EditView中的文本改变事件详解--转

    转自: http://blog.csdn.net/zoeice/article/details/7700529 android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面 ...

  3. 学习黑马教学视频SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied

    问题已解决. 总结: 报错:org.springframework.security.access.AccessDeniedException: Access is denied 当您遇到同样问题时, ...

  4. 数组NSArray与NSMutableArray的常用方法

    数组中可以放任何类型的数据,并且一个数组中的元素类型可以不一致.只要是(id类型)对象. NSArray 1.初始化 NSArray *array = @[]; 2.初始化,最后需要以nil结尾 NS ...

  5. Python自动化运维的职业发展道路(暂定)

    Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Dock ...

  6. mysql遇到java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

    在连接数据库的url中,加上allowPublicKeyRetrieval=true from:https://blog.csdn.net/Gushiyuta/article/details/9323 ...

  7. 使用 sp_attach_db 系统存储过程附加数据库时---转载

    //附加数据库 sp_attach_db 当使用 sp_attach_db 系统存储过程附加数据库时. sp_attach_db:将数据库附加到服务器. 语法 sp_attach_db [ @dbna ...

  8. 不要在PHP7中踩这些坑

    PHP是当今仍然是最流行的Web开发语言,目前在所有使用服务端编程语言的网站中,超过83%的站点在使用PHP.PHP7在性能方面实现跨越式的提升,然后有些坑我们还是要提醒PHPer不要踩. 1. 不要 ...

  9. BOM--location对象、history对象

    location对象 location 是最有用的BOM 对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能. 事实上,location 对象是很特别的一个对象,因为它既是win ...

  10. php+ajax实现无刷新动态加载数据技术

    我们浏览有些网页的时候,当拉动浏览器的滚动条时到页底时,页面会继续自动加载更多内容供用户浏览.这种技术我暂且称它为滚屏加载技术.我们发现很多网站用到这种技术,必应图片搜索.新浪微博.QQ空间等将该技术 ...