前言:搁置许久的更新要继续开始了!前一段时间一直在忙项目和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. BSOJ3760||洛谷P1453 城市环路 题解

    城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...

  2. spring切换多数据源

    应用场景:在一个项目需要用到两个或两个以上的数据库时,要进行切换数据库,来操作相应的表. 框架:用的是spring 的org.springframework.jdbc.datasource.looku ...

  3. C++标准库第二版笔记 3 和异常的理解 1

    C++标准库第二版笔记 3 和异常的理解 1 差错和异常(error and exception)的处理 标准异常类(exception class) 定义于 分为: 1.语言本身支持的异常 2.标准 ...

  4. 20175316 盛茂淞 MyCP(课下作业,必做)

    题目要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为 ...

  5. nginx上传文件时 nginx 413 Request Entity Too Large 错误

    产生原因: 上传文件的大小超出了 Nginx 允许的最大值,默认是1M: 解决方法: 修改Nginx的配置文件(一般是:nginx/nginx.conf),在 http{} 段中增大nginx上传文件 ...

  6. select下拉框左右变换

    效果图: 使用jQuery插件---multiselect2side做法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  7. jenkins maven git windows code 自动部署

    本人刚刚接触  写的不好就对付看看吧 哈哈哈O(∩_∩)O哈哈~ 最近看见别人弄得自动部署 自己也是手痒痒 也想弄一个 所以就弄了一个 windows的 我用的是https的  在网上看了很多都是 s ...

  8. 学以致用三十一-----IPAddressField has been removed

    python 和 django版本 在进行makemigrations的时候报错 设置的字段 class Servers(models.Model): '''服务器信息''' hostname = m ...

  9. Python开发——8.模块

    一.模块 1.模块 (1)定义:一个.py文件就是一个模块 (2)原因:为了防止程序代码越来越长,对函数进行分组放到不同的文件夹里. (3)优点:提高代码的可维护性:模块编写完毕可以被别人引用,也可以 ...

  10. openXML设置Excel行组合

    重要代码: row = new DOS.Row() { RowIndex = new DOX.UInt32Value(rowIndex), Spans = new DOX.ListValue<D ...