前言:搁置许久的更新要继续开始了!前一段时间一直在忙项目和C++的学习,所以搁置了!要改变注意了,要用C++进行编写了,因为要不断练习C++!

  面试题15:

书中要求只能遍历链表一次,所以代码如下:

#include<iostream>
#include<cstdlib>
using namespace std; struct ListNode
{
int data;
ListNode * next;
}; typedef struct ListNode linknode_t;
typedef struct ListNode* linklist_t;
linknode_t *CreateLink() // 创建空的链表 返回值 链表的首地址
{
linknode_t *H;
H = (linklist_t)malloc(sizeof(linknode_t)); H->next = NULL;
return H;
}
void InitLink(linknode_t *H) // 初始化一个空的链表
{
linknode_t *r, *p;
int i;
r = H; // r 指向 队尾位置
for(i = ; i < ; i++)
{
p = (linknode_t *)malloc(sizeof(linknode_t));
p->data = i+;
p->next = NULL; // 没有下一个节点
r->next = p; // 将p 放在 r 的后面
r = p; // r 指向新的队尾
} } void ShowLink(linknode_t* H) // 从队首->队尾 打印所有节点
{
linknode_t *p;
p = H->next;
while(p != NULL){
cout << " " << p->data;
p = p->next;
}
cout << endl;
} ListNode *FindKthToTail(ListNode *pListHead,unsigned int k)
{
if(pListHead == NULL || k == )
return NULL; ListNode *pAhead = pListHead;
ListNode *pBehind = NULL; for(unsigned int i=;i<k-;++i)
{
if(pAhead->next != NULL)
pAhead = pAhead->next;
else
{
return NULL;
}
} pBehind = pListHead;
while(pAhead->next != NULL)
{
pAhead = pAhead->next;
pBehind = pBehind->next;
} return pBehind;
} int main()
{
linknode_t *H = CreateLink();
InitLink(H);
ShowLink(H); linknode_t *S = FindKthToTail(H,);
cout << "data:" << S->data << endl; return ;
}

  总结:要熟练对单链表的使用!当我们用一个指针不能解决问题,可以尝试用两个指针遍历链表,可以让其中一个指针遍历的速度快一些(比如一次在链表上走两步),或者让它在链表上走若干步!

  面试题16:

  主要考察链表的反转:

  代码如下:

  

#include<iostream>
#include<cstdlib>
using namespace std; struct ListNode
{
int data;
ListNode * next;
}; typedef struct ListNode linknode_t;
typedef struct ListNode* linklist_t;
linknode_t *CreateLink() // 创建空的链表 返回值 链表的首地址
{
linknode_t *H;
H = (linklist_t)malloc(sizeof(linknode_t)); H->next = NULL;
return H;
}
void InitLink(linknode_t *H) // 初始化一个空的链表
{
linknode_t *r, *p;
int i;
r = H; // r 指向 队尾位置
for(i = ; i < ; i++)
{
p = (linknode_t *)malloc(sizeof(linknode_t));
p->data = i+;
p->next = NULL; // 没有下一个节点
r->next = p; // 将p 放在 r 的后面
r = p; // r 指向新的队尾
} } void ShowLink(linknode_t* H) // 从队首->队尾 打印所有节点
{
linknode_t *p;
p = H->next;
while(p != NULL){
cout << " " << p->data;
p = p->next;
}
cout << endl;
} ListNode *ReverseList(ListNode *pHead)
{
ListNode *pReversedHead = NULL;
ListNode *pNode = pHead;
ListNode *pPrev = NULL;
while(pNode != NULL)
{
ListNode *pNext = pNode->next; if(pNext == NULL)
pReversedHead = pNode; pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
} return pReversedHead;
} int main()
{
linknode_t *H = CreateLink();
InitLink(H);
ShowLink(H); linknode_t *S = ReverseList(H);
ShowLink(S); return ;
}

  面试17:

  题目如下:

  

  代码如下:

#include<iostream>
#include<cstdlib>
using namespace std; struct ListNode
{
int data;
ListNode * next;
}; typedef struct ListNode linknode_t;
typedef struct ListNode* linklist_t;
linknode_t *CreateLink() // 创建空的链表 返回值 链表的首地址
{
linknode_t *H;
H = (linklist_t)malloc(sizeof(linknode_t)); H->next = NULL;
return H;
}
void InitLink(linknode_t *H,int n=) // 初始化一个空的链表
{
linknode_t *r, *p;
int i;
r = H; // r 指向 队尾位置
for(i = ; i < ; i+=n)
{
p = (linknode_t *)malloc(sizeof(linknode_t));
p->data = i+n;
p->next = NULL; // 没有下一个节点
r->next = p; // 将p 放在 r 的后面
r = p; // r 指向新的队尾
} } void ShowLink(linknode_t* H) // 从队首->队尾 打印所有节点
{
linknode_t *p;
p = H->next;
while(p != NULL){
cout << " " << p->data;
p = p->next;
}
cout << endl;
} ListNode *Merge(ListNode *pHead1,ListNode *pHead2)
{
//鲁棒性处理,空指针会造成程序崩溃
if(pHead1 == NULL)
return pHead2;
else if(pHead2 == NULL)
return pHead1; ListNode * pMergedHead = NULL; if(pHead1->data < pHead2->data)
{
pMergedHead = pHead1;
pMergedHead->next = Merge(pHead1->next,pHead2);//递归处理
}
else
{
pMergedHead = pHead2;
pMergedHead->next = Merge(pHead1,pHead2->next);//递归处理
} return pMergedHead;
} int main()
{
linknode_t *H = CreateLink();
InitLink(H);
linknode_t *H1 = CreateLink();
InitLink(H1,);
ShowLink(H);
ShowLink(H1); linknode_t *S = Merge(H->next,H1->next);
while(S != NULL){
cout << " " << S->data;
S = S->next;
}
cout << endl; return ;
}

  总结:理解递归部分的思想。

  面试题18:

  面试题18是关于二叉树的,先简单介绍一下二叉树吧。 

   二叉树特点: 第i层 最多节点的个数 2^(i-1)

  树的深度 h , 树节点 最多 2^h-1

  遍历二叉树方法:先序遍历  中序遍历 后序遍历,具体遍历方法介绍可以在网上找,这里就不具体介绍了。

  程序中三种方法都写出来了,但只用了先序遍历。

  题目如下:

   

  代码如下:

  

#include<iostream>
#include<cstdlib>
using namespace std; struct BinaryTreeNode
{
int data; //节点数据
BinaryTreeNode *lchild,*rchild; //左孩子、右孩子
};
typedef struct BinaryTreeNode tree_t; /******
构造一个二叉树 递归实现
参数:形参1:开始值,形参2:结束值
******/
tree_t *CreateTree(int i, int max)
{
//递归结束条件
if(i > max)
{
return NULL; // == return 0;
} tree_t *T; T = (tree_t *)malloc(sizeof(tree_t)); T->data = i;
T->lchild = CreateTree(*i, max);
T->rchild = CreateTree(*i+, max);
return T;
} //先序遍历输出二叉树
void FirstRoot_DLR(tree_t *p)
{
if(p == NULL)
return ;
cout << " " << p->data;
FirstRoot_DLR(p->lchild);
FirstRoot_DLR(p->rchild);
} //中序遍历输出二叉树 程序中未使用
void MiddleRoot_DLR(tree_t *p)
{
if(p == NULL)
return; MiddleRoot_DLR(p->lchild);
cout << " " << p->data;
MiddleRoot_DLR(p->rchild);
} //后序遍历输出二叉树 程序中未使用
void LastRoot_DLR(tree_t *p)
{
if(p == NULL)
return; LastRoot_DLR(p->lchild);
LastRoot_DLR(p->rchild);
cout << " " << p->data;
} bool DoesTree1HaveTree2(tree_t *pRoot1,tree_t *pRoot2)
{
//树B为空直接不检查
if(pRoot2 == NULL)
return true; if(pRoot1 == NULL)
return false; if(pRoot1->data != pRoot2->data)
return false; return DoesTree1HaveTree2(pRoot1->lchild,pRoot2->lchild)&&DoesTree1HaveTree2(pRoot1->rchild,pRoot2->rchild);
} bool HasSubtree(tree_t *pRoot1,tree_t *pRoot2)
{
bool result = false; if(pRoot1!=NULL && pRoot2!=NULL)
{
result = DoesTree1HaveTree2(pRoot1,pRoot2);
if(!result)
HasSubtree(pRoot1->lchild,pRoot2);
if(!result)
HasSubtree(pRoot1->rchild,pRoot2);
}
return result;
} int main()
{
tree_t *T1 = CreateTree(,);
FirstRoot_DLR(T1);
cout << endl;
tree_t *T2 = CreateTree(,);
FirstRoot_DLR(T2);
cout << endl;
//使用boolalpha输出为bool类型
cout << boolalpha <<HasSubtree(T1,T2) << endl; return ;
}

  总结:书中第三章主要强调了代码的规范性、完整性和鲁棒性,鲁棒性例如对空指针的判断和处理...,用链表和二叉树做的例子,要熟悉掌握这两种数据结构!

剑指offer例题分享--4的更多相关文章

  1. 剑指offer例题分享--8

    前言:继续分享,加油! 面试题44: 代码如下: #include<iostream> #include<stdlib.h> using namespace std; int ...

  2. 剑指offer例题分享--7

    前言:继续前面的分享... 面试题31: 代码如下: #include<iostream> #include<limits.h> using namespace std; bo ...

  3. 剑指offer例题分享--6

    前言:继续整理例题,快速做完这部分,然后继续用C++去刷数据结构和算法的题. 面试题28: 代码如下: #include<iostream> #include<stdio.h> ...

  4. 剑指offer例题——跳台阶、变态跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: n<=0时,有0种跳法 n=1时,只有一种跳法 n=2时,有 ...

  5. 剑指offer 例题

    题目: 实现一个排序算法,排序对象是本公司员工的年龄.要求时间复杂度O(n),空间复杂度不能超过O(n). #include<iostream> using namespace std; ...

  6. 剑指offer例题——反转链表

    题目描述 输入一个链表,反转链表,输出新链表的表头 程序编写 将链表反转 public class Solution { public ListNode ReverseList(ListNode he ...

  7. 剑指offer例题——链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 编程过程 此处采用两个指针依次后移的方法来求解,首先,用一个指针移到第k个位置,之后将第二个指针放在第一位,与第二个指针一同移动,当第二个指针移动 ...

  8. 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数.其中负数用补码表示. 首先明确补码的定义: 原码 反码 补码 将最高位作为符号位(0表示正,1表示负), 其它数字位表达数值本身的绝对值的数字表示方式 ...

  9. 剑指offer例题——用两个栈实现队列

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 首先是概念理解,栈和对列存取的区别 栈(stack)是一种后进先出(last in first out, LI ...

随机推荐

  1. #error "OpenCV 4.x+ requires enabled C++11 support"解决方法

    报错的本质是需要c++11的支持,顾名思义,当前的编译环境是c++11以下的版本.我用的cmake编译,因此再cmakelists文件内添加设置c++标准为14就可以编译通过. )

  2. Java:ConcurrentHashMap的锁分段技术

    术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值.  哈希表 hash table 根据设定的哈希函数H(ke ...

  3. Codeforces 837 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 并没有找到难度评级但感觉是div3div3div3场. A题 题意:一个单词的价值是里面大写字母的个数,一篇文章的价值是里面所有单词的价值的 ...

  4. (30)3 ways to make better decisions — by thinking like a computer

    https://www.ted.com/talks/tom_griffiths_3_ways_to_make_better_decisions_by_thinking_like_a_computer0 ...

  5. 大数据项目测试<二>项目的测试工作

    大数据的测试工作: 1.模块的单独测试 2.模块间的联调测试 3.系统的性能测试:内存泄露.磁盘占用.计算效率 4.数据验证(核心) 下面对各个模块的测试工作进行单独讲解. 0. 功能测试 1. 性能 ...

  6. 解决jenkins shell执行sonar-scanner提示命令存在的问题

    通过jenkins的以下三个方式去执行sonar-scanner,抛如下错误. Send files or execute commands over SSH before the build sta ...

  7. [转载]ECMall模板解析语法与机制

    ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词 ...

  8. 0723掰棒子记录--vue的数据渲染

    问题1:想要在一个panel标签中添加一个图片,panel中有一个datalist属性.如何设计标签可以插入想要的图片. template: <panel :list="dataLis ...

  9. bzoj1038(半平面交)

    #include<iostream> #include<cstring> #include<cmath> #include<cstdio> #inclu ...

  10. 如何更改github工程的语言属性

    当创建github项目的时候,github本身会根据提交文件的数量来自动推断工程的开发语言,有时这种推断结果会与实际情况不太相符.比如上传一个java的web工程,如果在工程里存在大量的html.ja ...