链表和数组的区别在哪里 【微软面试100题 第七十八题】

题目要求:

  链表和数组的区别在哪里?

题目分析:

  数组静态分配内存,链表动态分配内存;  

  数组预先定义长度,链表预先无需管理长度;

  数组在内存中连续,链表可能连续;

  数组元素在栈区,链表元素在堆区;

  数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);

  数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1);

  数组相对更省空间,存储一个元素链表还需要存储一个next指针;

  数组排序相对比链表简单。

时间: 2024-08-02 21:58:35

链表和数组的区别在哪里 【微软面试100题 第七十八题】的相关文章

在左移的递减数组中查找某数 【微软面试100题 第四十八题】

题目要求: 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1,}左移两位形成的,在这种数组中查找某个数. 题目分析: 方法1 逐个查找,遍历一遍数组,时间复杂度O(N). 方法2 二分查找,时间复杂度O(logN).具体分析见下图: 代码实现: #include <iostream> using namespace std; int Helper(int a[],int k,int s,int t); int FindKInArray(int

数组中超过出现次数一半的数字 【微软面试100题 第七十四题】

问题要求: 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. 参考资料:编程之美2.3 寻找发帖水王 问题分析: 方法1 对数组排序,然后顺次查找其中最多的: 方法2 对数组排序,最中间一个肯定为要找的数字,时间复杂度O(NlogN): 方法3 每次消去数组中两个不同的数,最后剩下的肯定为要找的数字,时间复杂度O(N). 方法3代码1如下,以下是图解代码1 代码实现: //代码1#include <stdio.h> int Find(int* ID, int N); int ma

链表补充及链表和数组的区别

初稿:2017-11-19 13:05:57 4种链表 不循环单链表:加头结点,使得插入删除操作相同,不必特别处理插入或删除的是第一个位置的情况. 循环单链表:引用参数是最后一个结点的指针pTail,这样既能迅速找到首结点pHead = pTail->next,也能迅速获取表尾. 不循环双向链表:p所指结点后插入结点q.  q->next = p->next; p->next->pre = q; p->next = q; q->pre = p; 循环双向链表:引用

链表和数组的区别

数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的不同处,于是他们的真正不同处渐渐显现了:链表的效率为何比数组低些?先从两者的初始化开始.数组无需初始化,因为数组的元素在内存的栈区,系统自动申请空间.而链表的结点元素在内存的堆区,每个元素须手动申请空间,如malloc.也就是说数组是静态分配内存,而链表是动态分配内存.链表如此麻烦为何还要用链表呢?数组不

微软面试100题系列算法心得

微软100题系列地址 答案地址 谓之随笔,当是自己在练习此类算法的一些想法,一些心得,一些领悟,一些借鉴,当自引用之时,会附上相应的链接! 题:把二元查找树转变成排序的双向链表(树) 描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 思维过程[个人思维]: 1. 二元查找树是指在任何结点看来,它的左子树上的值要少于当前结点的值,而它的右子树上的值要大于当前结点的值,对于等于的值那就看自己的原则放左子树还是右子树. 2. 关于树的算法必

链表和数组的区别在哪里?

二者都属于一种数据结构 从逻辑结构来看 1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况.当数据增加时,可能超出原先定义的元素个数:当数据减少时,造成内存浪费:数组可以根据下标直接存取. 2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入.删除数据项.(数组中插入.删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素 从内存存储来看 1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小 2. 链表从

面试-链表和数组的区别

相关资料:1.http://blog.csdn.net/kedark/article/details/549155772.http://blog.csdn.net/wqsys/article/details/7656650 数组:1.将元素在内存中连续存放.2.每个元素占用内存相同.3.通过下标迅速访问数组中任何元素.4.增加.删除一个元素需移动大量元素.5.需要快速访问数据,很少或不插入和删除元素,应用数组.6.(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小.7.内存占用空间是固

调整数组顺序使奇数位于偶数前面 【微软面试100题 第五十四题】

题目要求: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 要求时间复杂度为O(n). 参考资料:剑指offer第14题. 题目分析: 使用两个指针,pBegin和pEnd,pBegin从开头往后遍历,pEnd从结尾往前遍历,当pBegin遇到偶数和pEnd遇到奇数时,交换两个数,然后继续遍历,直到pBegin>pEnd,则结束. 代码实现: #include <iostream> using namespace std; void

找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】

题目要求: 一个整型数组里除了两个数字机之外,其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字.要求时间复杂度O(N).空间复杂度O(1). 参考资料:剑指offer第40题. 题目分析: 已知: 1.两个相同的数字异或的结果为0,即a^a = 0. 2.两个不相同的数字异或的结果的二进制中某一位为1,则这两个数字的二进制中对应位一个为0,一个为1.如3^2 = 1,对于最低位的二进制,3的最低位二进制为1,2的最低位二进制位0,则结果1的最低位二进制肯定为1. 假设原数组中只出现一