数据结构常见笔试题

合集下载

数据结构考试题及答案

数据结构考试题及答案

数据结构考试题及答案一、选择题(每题2分,共20分)1. 以下哪个不是线性数据结构?A. 数组B. 链表C. 树D. 图2. 在一个单链表中,删除一个节点的操作需要知道该节点的:A. 地址B. 值C. 索引D. 前驱节点的引用3. 栈(Stack)是一种:A. 线性表B. 树状结构C. 图结构D. 散列表4. 哈希表解决冲突最常用的方法是:A. 排序B. 链地址法C. 再散列D. 除留余数法5. 以下哪个排序算法是稳定的?A. 快速排序B. 冒泡排序C. 选择排序D. 堆排序二、简答题(每题10分,共30分)1. 简述数组和链表的区别。

2. 解释二叉搜索树的基本概念及其优势。

3. 什么是递归?请给出一个简单的递归算法例子。

三、计算题(每题25分,共50分)1. 给定一个无序数组,请写出一个时间复杂度为O(n log n)的排序算法,并说明其工作原理。

2. 描述如何使用队列来实现一个简单的文本编辑器的撤销和重做功能。

四、编程题(共30分)编写一个函数,该函数接受一个整数数组作为参数,返回数组中所有元素的和。

如果数组为空,返回0。

答案一、选择题1. 答案:C(树和图都是非线性结构)2. 答案:D(需要前驱节点的引用来删除节点)3. 答案:A(栈是一种后进先出的特殊线性表)4. 答案:B(链地址法是解决哈希冲突的常用方法)5. 答案:B(冒泡排序是稳定的排序算法)二、简答题1. 数组和链表的区别:- 数组是连续的内存空间,链表是非连续的。

- 数组的索引访问速度快,链表需要遍历。

- 数组的大小固定,链表动态可变。

2. 二叉搜索树的基本概念及其优势:- 二叉搜索树是一种特殊的二叉树,左子树上所有节点的值小于它的根节点的值,右子树上所有节点的值大于它的根节点的值。

- 优势:支持快速的查找、插入和删除操作。

3. 递归是函数自己调用自己的过程。

例如,计算n的阶乘的递归算法: ```cint factorial(int n) {if (n <= 1) return 1;return n * factorial(n - 1);}```三、计算题1. 快速排序算法:- 选择一个元素作为“基准”(pivot)。

数据结构试题集(8套卷子+答案)

数据结构试题集(8套卷子+答案)

数据结构试题集(8套卷子+答案)《数据结构》试卷一一、填空题:(共20分)1、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用存储结构。

2、队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是。

3、在一棵二叉树中,度为0的结点个数为n0,度为2的个数为n2,则n0= 。

4、二叉树的前序遍历序列等同于该二叉树所对应森林的遍历序列5、对一棵二叉排序树,若以遍历该树,将得到一个以关键字递增顺序排列的有序序列。

6、三个结点a,b,c组成二叉树,共有种不同的结构。

7、在AVL树中,由于在A结点的右孩子的右子树上插入结点,使A结点的平衡因子由-1变为-2,使其失去平衡,应采用型平衡旋转。

8、图的遍历有两种,它们是。

9、堆排序的时间复杂度为。

10、在含有N个结点的二叉链表中有空链域,通常用这些空链域存储线索,从而得另一种链式存储结构----线索链表。

二、单项选择题(共20分)1、若进栈序列为1,2,3,4,假定进栈和出栈可以穿插进行,则可能的出栈序列是()(A)2,4,1,3(B)3,1,4,2(C)3,4,1,2(D)1,2,3,42、有一棵非空的二叉树,(第0层为根结点),其第i层上最多有多少个结点?()(A)2i(B)21-i(C)21+i(D) i 3、设电文中出现的字母为A,B,C,D,E,每个字母在电文中出现的次数分别为9,27,3,5,11,按huffman编码,则字母A编码为()(A)10(B)110(C)1110(D)11114、下面关于数据结构的叙述中,正确的叙述是()(A)顺序存储方式的优点是存储密度大,且插、删除运算效率高(B)链表中每个结点都恰好包含一个指针(C)包含n个结点的二叉排序树的最大检索长度为logn2(D)将一棵树转为二叉树后,根结点无右子树5、程序段:y:=0while n>=(y+1)*(y+1) doy:=y+1enddo的时间复杂度为()(A)O(n) (B)O(n2) (C)O(n2/1) (D)O(1)6、排序方法中,关键码比较的次数与记录的初始排列无关的是( )(A) shell排序 (B) 归并排序 (C) 直接插入排序 (D) 直接选择排序7、数组q[0..n-1]作为一个环行队列,f 为当前队头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数总小于n,则队列中元素个数为( )(A) r-f (B) n+f-r (C) n+r-f (D) (n+r-f) mod n8、为了有效的利用散列查找技术,需要解决的问题是:( )Ⅰ:找一个好的散列函数Ⅱ:设计有效的解决冲突的方法Ⅲ:用整数表示关键码值(A) Ⅰ和Ⅲ (B) Ⅰ和Ⅱ (C) Ⅱ和Ⅲ (D)Ⅰ,Ⅱ和Ⅲ9、引入线索二叉树的目的是()(A) 加快查找结点的前驱或后继的速度(B) 为了能在二叉树中方便的进行插入与删除(C) :为了能方便的找到双亲(D) 使二叉树的遍历结果唯一10、用二分(折半)查找表的元素的速度比用顺序法()(A) 必然快(B) 必然慢(C): 相等(D): 不能确定三、简答题:(共40分)1、已知某二叉树按中序遍历序列为BFDAEGC,按前序遍历序列为ABDFCEG,试画出该二叉树形状,并写出它的后序遍历序列。

数据结构笔试复习

数据结构笔试复习

数据结构笔试复习⼀选择题1.下述哪⼀条是顺序存储结构的优点?()A.存储密度⼤ B.插⼊运算⽅便 C.删除运算⽅便 D.可⽅便地⽤于各种逻辑结构的存储表⽰2.数据结构在计算机内存中的表⽰是指( )。

A. 数据的物理结构B. 数据结构C. 数据的逻辑结构D. 数据元素之间的关系3.下⾯关于线性表的叙述中,错误的是哪⼀个?()A.线性表采⽤顺序存储,必须占⽤⼀⽚连续的存储单元。

B.线性表采⽤顺序存储,便于进⾏插⼊和删除操作。

C.线性表采⽤链接存储,不必占⽤⼀⽚连续的存储单元。

D.线性表采⽤链接存储,便于插⼊和删除操作。

4.若线性表最常⽤的操作是存取第i个元素及其前驱的值,则采⽤( )存储⽅式节省时间。

A. 单链表B. 双向链表C. 循环链表D. 顺序表5.线性表是具有n 个()的有限序列(n>0)。

A.表元素 B.字符 C.数据元素 D.数据项 E.信息项6.若某线性表最常⽤的操作是存取任⼀指定序号的元素和在最后进⾏插⼊和删除运算,则利⽤()存储⽅式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表7.某线性表中最常⽤的操作是在最后⼀个元素之后插⼊⼀个元素和删除第⼀个元素,则采⽤()存储⽅式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表8.设⼀个链表最常⽤的操作是在末尾插⼊结点和删除尾结点,则选⽤( )最节省时间。

A. 单链表B.单循环链表C. 带尾指针的单循环链表D.带头结点的双循环链表9.若某表最常⽤的操作是在最后⼀个结点之后插⼊⼀个结点或删除最后⼀个结点。

则采⽤()存储⽅式最节省运算时间。

A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表10. 链表不具有的特点是()A.插⼊、删除不需要移动元素 B.可随机访问任⼀元素C.不必事先估计存储空间 D.所需空间与线性长度成正⽐11、3个结点可构成_____棵不同形态的⼆叉树。

数据结构笔试题

数据结构笔试题

数据结构笔试题1. 实现一个栈数据结构,包含以下功能:- 入栈操作(push):将元素加入栈顶- 出栈操作(pop):将栈顶元素移除并返回- 判断栈是否为空(isEmpty):若栈为空,则返回真;否则返回假- 获取栈顶元素(top):返回栈顶元素,但不移除2. 解析逆波兰表达式逆波兰表达式是一种将运算符写在操作数之后的表达式表示法,例如:1 2 + 3 * 表示 (1 + 2) * 3。

在不使用括号的情况下,通过使用栈可以轻松地解析并计算逆波兰表达式。

以下是解析逆波兰表达式的步骤:- 创建一个栈用于存储操作数- 从左到右扫描逆波兰表达式的每个元素- 若遇到操作数,则将其入栈- 若遇到运算符,则取出栈顶的两个操作数,进行相应的运算,并将结果入栈- 扫描完整个逆波兰表达式后,栈顶的元素即为表达式的结果例如,对于逆波兰表达式 "2 3 +",我们可以逐步进行计算:- 遇到2,将其入栈:栈为 [2]- 遇到3,将其入栈:栈为 [2, 3]- 遇到+运算符,取出2和3,进行相加,并将结果5入栈:栈为[5]最终栈顶的元素5即为逆波兰表达式 "2 3 +" 的结果。

3. 实现一个队列数据结构,包含以下功能:- 入队操作(enqueue):将元素加入队尾- 出队操作(dequeue):将队首元素移除并返回- 判断队列是否为空(isEmpty):若队列为空,则返回真;否则返回假- 获取队首元素(front):返回队首元素,但不移除队列是一种先进先出(FIFO)的数据结构,类似于现实生活中的排队情况。

4. 二叉树的前序、中序和后序遍历- 前序遍历:按照「根节点 - 左子树 - 右子树」的顺序遍历二叉树 - 中序遍历:按照「左子树 - 根节点 - 右子树」的顺序遍历二叉树- 后序遍历:按照「左子树 - 右子树 - 根节点」的顺序遍历二叉树以上三种遍历方式是针对二叉树的,通过递归或使用栈数据结构可以实现遍历操作。

数据结构 面试笔试题

数据结构 面试笔试题

数据结构面试笔试题
以下是一些常见的面试笔试题,用于测试应聘者对数据结构的理解和应用能力:
1. 什么是数据结构?请列举几种常见的数据结构,并简要描述它们的特性和用途。

2. 什么是线性数据结构和非线性数据结构?请分别给出几个例子。

3. 什么是数组、链表、栈、队列、树、图等数据结构?请简要描述它们的特性和用途。

4. 请解释什么是哈希表,并给出几个常见的哈希函数。

5. 请解释什么是二叉树,并给出几个常见的二叉树类型。

6. 请解释什么是平衡二叉树,并给出几个常见的平衡二叉树类型。

7. 请解释什么是堆,并给出几个常见的堆类型。

8. 请解释什么是排序算法,并给出几个常见的排序算法。

9. 请解释什么是查找算法,并给出几个常见的查找算法。

10. 请解释什么是贪心算法,并给出几个常见的贪心算法。

11. 请解释什么是动态规划,并给出几个常见的动态规划问题。

12. 请解释什么是分治算法,并给出几个常见的分治算法。

13. 请解释什么是回溯算法,并给出几个常见的回溯算法。

14. 如果你需要在内存中存储一个大型数组,你将选择哪种数据结构?为什么?
15. 你如何比较两个数组或两个链表的长度?
16. 假设我们有一个二叉树,其节点存储的是整数值,我们想找出最小的节点值。

请设计一个有效的算法来解决这个问题。

17. 假设我们有一个无序数组,我们想将其排序。

请设计一个有效的算法来解决这个问题。

18. 假设我们有一个整数数组,我们想找到数组中的最大值和最小值。

请设计一个有效的算法来解决这个问题。

数据结构考试题目及答案pdf

数据结构考试题目及答案pdf

数据结构考试题目及答案pdf一、单项选择题(每题2分,共10分)1. 在数据结构中,线性结构和非线性结构的主要区别在于()。

A. 数据元素之间是否有逻辑关系B. 是否有且仅有一个根节点C. 是否有多个根节点D. 数据元素之间是否有顺序关系答案:A2. 链表中每个节点包含数据元素和()。

A. 一个指针B. 多个指针C. 一个数据域D. 一个数据域和一个指针答案:D3. 在二叉树的遍历中,先序遍历的顺序是()。

A. 根-左-右B. 左-根-右C. 右-根-左D. 根-右-左答案:A4. 哈希表解决冲突的方法不包括()。

A. 开放寻址法B. 链地址法C. 线性探测法D. 二分查找法答案:D5. 堆是一种特殊的完全二叉树,其特点是()。

A. 每个节点的值都大于其子节点的值B. 每个节点的值都小于其子节点的值C. 每个节点的值都大于或等于其子节点的值D. 每个节点的值都小于或等于其子节点的值答案:C二、填空题(每题2分,共10分)1. 在顺序表中,插入一个元素的平均时间复杂度为 O(n) 。

2. 栈是一种特殊的线性表,其特点是后进先出(LIFO),即后进的元素先出栈。

3. 快速排序的时间复杂度在最坏情况下为 O(n^2) 。

4. 广义表的表示形式为 (a, b, c) ,其中a、b、c可以是数据元素或子表。

5. 在图的遍历中,深度优先搜索(DFS)使用的是栈数据结构。

三、简答题(每题10分,共20分)1. 请简述二叉搜索树和平衡二叉树的区别。

答:二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含小于该节点的值,右子树只包含大于该节点的值。

平衡二叉树除了满足二叉搜索树的性质外,还要求每个节点的左子树和右子树的高度差不超过1,以保持树的平衡,从而提高查找效率。

2. 什么是图的连通分量?请举例说明。

答:图的连通分量是指图中的最大的连通子图。

如果一个图不是连通的,那么它将被划分为若干个连通分量,每个连通分量内部的顶点都是相互连通的,但不同分量之间没有直接的边相连。

数据结构入门笔试题

数据结构入门笔试题

数据结构入门笔试题
以下是一些数据结构的入门笔试题:
1. 给定一个数组,找到数组中最大的元素。

输入示例:[1, 5, 3, 9, 2, 7]
输出示例:9
2. 给定一个链表,反转链表。

输入示例:1 -> 2 -> 3 -> 4 -> 5
输出示例:5 -> 4 -> 3 -> 2 -> 1
3. 实现一个栈,包括入栈(push)、出栈(pop)和获取栈顶元素(peek)的操作。

4. 实现一个队列,包括入队(enqueue)、出队(dequeue)和获取队首元素(peek)的操作。

5. 给定两个排序数组,合并成一个排序数组。

输入示例:arr1 = [1, 3, 5], arr2 = [2, 4, 6]
输出示例:[1, 2, 3, 4, 5, 6]
6. 实现一个二叉树,包括插入节点(insert)、删除节点(delete)和查找节点(search)的操作。

7. 给定一个字符串,判断它是否是回文字符串(正读和反读都一样)。

输入示例: "racecar"
输出示例: true
8. 给定一个字符串,计算它的字符频率。

输入示例: "hello"
输出示例: {'h': 1, 'e': 1, 'l': 2, 'o': 1}
这些题目涉及到了数组、链表、栈、队列、树等常见的数据结构,是入门学习数据结构时的常见笔试题。

数据结构考试题库(含参考答案)

数据结构考试题库(含参考答案)

第1章绪论一、选择题1. 算法的计算量的大小称为计算的()。

【北京邮电大学2000 二、3 (20/8分)】A.效率 B. 复杂性 C. 现实性 D. 难度2. 算法的时间复杂度取决于()【中科院计算所1998 二、1 (2分)】A.问题的规模 B. 待处理数据的初态 C. A和B3.计算机算法指的是(1),它必须具备(2)这三个特性。

(1) A.计算方法 B. 排序方法 C. 解决问题的步骤序列 D. 调度方法(2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性C. 确定性、有穷性、稳定性D. 易读性、稳定性、安全性【南京理工大学1999 一、1(2分)【武汉交通科技大学1996 一、1(4分)】4.一个算法应该是()。

【中山大学1998 二、1(2分)】A.程序B.问题求解步骤的描述C.要满足五个基本特性D.A和C.5. 下面关于算法说法错误的是()【南京理工大学2000 一、1(1.5分)】A.算法最终必须由计算机程序实现B. 为解决某问题的算法同为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性D. 以上几个都是错误的6. 下面说法错误的是()【南京理工大学2000 一、2 (1.5分)】(1)算法原地工作的含义是指不需要任何额外的辅助空间(2)在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法(3)所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界(4)同一个算法,实现语言的级别越高,执行效率就越低A.(1) B.(1),(2) C.(1),(4) D.(3)7.从逻辑上可以把数据结构分为()两大类。

【武汉交通科技大学1996 一、4(2分)】A.动态结构、静态结构B.顺序结构、链式结构C.线性结构、非线性结构D.初等结构、构造型结构8.以下与数据的存储结构无关的术语是()。

【北方交通大学2000 二、1(2分)】A.循环队列 B. 链表 C. 哈希表 D. 栈9.以下数据结构中,哪一个是线性结构()?【北方交通大学2001 一、1(2分)】A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串10.以下那一个术语与数据的存储结构无关?()【北方交通大学2001 一、2(2分)】A.栈 B. 哈希表 C. 线索树 D. 双向链表11.在下面的程序段中,对x的赋值语句的频度为()【北京工商大学2001 一、10(3分)】FOR i:=1 TO n DOFOR j:=1 TO n DOx:=x+1;A.O(2n) B.O(n) C.O(n2) D.O (log2n)12.程序段FOR i:=n-1 DOWNTO 1 DOFOR j:=1 TO i DOIF A[j]>A[j+1]THEN A[j]与A[j+1]对换;其中n为正整数,则最后一行的语句频度在最坏情况下是()A. O(n)B. O(nlogn)C. O(n3)D. O(n2) 【南京理工大学1998一、1(2分)】13.以下哪个数据结构不是多型数据类型()【中山大学1999 一、3(1分)】A.栈B.广义表C.有向图D.字符串14.以下数据结构中,()是非线性数据结构【中山大学1999 一、4】A.树B.字符串C.队D.栈15. 下列数据中,()是非线性数据结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.栈和队列的共同特点是(只允许在端点处插入和删除元素)2.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)3.链表不具有的特点是(B)A.不必事先估计存储空间B.可随机访问任一元素C.插入删除不需要移动元素D.所需空间与线性表长度成正比4.用链表表示线性表的优点是(便于插入和删除操作)5.在单链表中,增加头结点的目的是(方便运算的实现)6.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)7.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)A.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续不连续都可以8.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构)9.具有3个结点的二叉树有(5种形态)10.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13)(n0 = n2+1)11.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba)12.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca)13.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。

1.在计算机中,算法是指(解题方案的准确而完整的描述)2.算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环)3.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数)4.算法的空间复杂度是指(执行过程中所需要的存储空间)5.算法分析的目的是(分析算法的效率以求改进)6.下列叙述正确的是(C)A.算法的执行效率与数据的存储结构无关B.算法的空间复杂度是指算法程序中指令(或语句)的条数C.算法的有穷性是指算法必须能在执行有限个步骤之后终止D.算法的时间复杂度是指执行算法程序所需要的时间7.数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及(数据的存储结构)8.数据结构中,与所使用的计算机无关的是数据的(C)A.存储结构 B.物理结构 C.逻辑结构 D.物理和存储结构9.下列叙述中,错误的是(B)A.数据的存储结构与数据处理的效率密切相关B.数据的存储结构与数据处理的效率无关C.数据的存储结构在计算机中所占的空间不一定是连续的D.一种数据的逻辑结构可以有多种存储结构10.数据的存储结构是指(数据的逻辑结构在计算机中的表示)11.数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构)12.根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为(线性结构和非线性结构)13.下列数据结构具有记忆功能的是(C)A.队列 B.循环队列 C.栈 D.顺序表14.递归算法一般需要利用(栈)实现。

15.由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的机率)16.与单向链表相比,双向链表的优点之一是(更容易访问相邻结点)17.设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为(350)说明:完全二叉树总结点数为N,若N为奇数,则叶子结点数为(N+1)/2;若N 为偶数,则叶子结点数为N/2。

18.串的长度是(串中所含字符的个数)19.设有两个串p和q,求q在p中首次出现位置的运算称做(模式匹配)20.N个顶点的连通图中边的条数至少为(N-1)21.N个顶点的强连通图的边数至少有(N)22.对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为(n)23.最简单的交换排序方法是(冒泡排序)24.假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为(n(n-1)/2)25.在待排序的元素序列基本有序的前提下,效率最高的排序方法是(冒泡排序)26.希尔排序法属于(插入类排序)27.堆排序法属于(选择类排序)28.已知数据表A中每个元素距其最终位置不远,为节省时间,应采用(直接插入排序)29.算法的基本特征是有穷性、可行性、确定性和拥有足够的情报。

1.一个算法通常由两种基本要素组成:一是对数据对象的运算和操作,二是算法的控制结构。

2.所谓数据处理是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、更改等运算,也包括对数据元素进行分析。

3.数据结构是指相互有关联的数据元素的集合。

4.数据结构分为逻辑结构与存储结构,线性链表属于(存储结构)。

5.数据元素之间的任何关系都可以用前驱和后继关系来描述。

6.数据的逻辑结构有线性结构和非线性结构两大类。

7.常用的存储结构有顺序、链接、索引等存储结构。

8.栈的基本运算有三种:入栈、退栈与读栈顶元素。

9.队列主要有两种基本运算:入队运算与退队运算。

10.在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。

11.栈和队列通常采用的存储结构是链式存储和顺序存储。

12.循环队列主要有两种基本运算:入队运算与退队运算。

每进行一次入队运算,队尾指针就进1。

13.当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算。

这种情况称为上溢。

14.当循环队列为空时,不能进行退队运算,这种情况称为下溢。

15.在一个容量为25的循环队列中,若头指针front=16,尾指针rear=9,则该循环队列中共有18个元素。

注:当rear<front时,元素个数=总容量-(front -rear);当rear>front时,元素个数=rear-front。

1、链表反转(无表头结点)单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。

比如一个链表是这样的:1->2->3->4->5通过反转后成为5->4->3->2->1。

最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。

源代码如下:法一:typedef struct LNode{int data;LNode *next;} LNode, *LinkList;void Reverse(LinkList &head){if (head == NULL)return;}还有一种利用递归的方法。

这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。

不过,这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数返回的节点的next域置为NULL。

因为要改变head指针,所以我用了引用。

算法的源代码如下:法二:LNode* Reverse(LNode *p, LinkList &head){if (p == NULL || p->next == NULL){head = p;return p;}else{LNode *tmp = Reverse(p->next, head);tmp->next = p;p->next = NULL;return p;}}2.判断一个链表是否存在环,例如下面这个链表就存在一个环:例如N1->N2->N3->N4->N5->N2就是一个有环的链表,环的开始结点是N5这里有一个比较简单的解法。

设置两个指针p1,p2。

每次循环p1向前走一步,p2向前走两步。

直到p2碰到NULL指针或者两个指针相等结束循环。

如果两个指针相等则说明存在环。

求环长:按照上面两个指针不同步长步进的方法,第一次相遇时记录当前指针,步长为1的指针继续走,计数,直到再次来到记录的指针,经过的步数即为环长。

找环入口:根据所得环长Y,设置指针指向头部,另一指针先向前走Y。

若两指针当前指向的node相同,则为入口,否则各自向前走1再判断是否相等。

struct Node{int data;Node *next;};bool IsLoop(Node *head){Node *p1 = head,*p2 = head;if (head == NULL || head->next == NULL){return false;}do{p1 = p1->next;p2 = p2->next->next;} while (p2 && p2->next && p1 != p2);if (p1 == p2)return true;elsereturn false;}3.判断两个数组中是否存在相同的数字:给定两个排好序的数组,怎样高效地判断这两个数组中存在相同的数字?这个问题首先想到的是一个O(nlogn)的算法。

就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。

用C++实现代码如下:bool FindCommon(int a[], int size1, int b[], int size2){int i;for (i = 0; i < size1; i++){int start = 0, end = size2-1, mid;while (start <= end){mid = (start + end)/2;if (a[i] == b[mid])return true;else if (a[i] < b[mid])end = mid - 1;elsestart = mid + 1;}}return false;}后来发现有一个O(n)算法。

因为两个数组都是排好序的。

所以只要一次遍历就行了。

首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。

推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。

bool FindCommon2(int a[], int size1, int b[], int size2){int i = 0, j = 0;while (i < size1 && j < size2){if (a[i] == b[j])return true;if (a[i] > b[j])j++;if (a[i] < b[j])i++;}return false;}4.“最大子序列”问题:给定一整数序列A1,A2,...,An(可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。

例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列的和为21。

相关文档
最新文档