数组和链表的区别浅析
1.链表是什么
链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;
链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。
所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。链表有很多种不同的类型:单向链表、双向链表及循环链表。
2.单向链表
单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。
3.双向链表
从上图可以很清晰的看出,每个节点有2个链接,一个是指向前一个节点(当此链接为第一个链接时,指向的是空值或空列表),另一个则指向后一个节点(当此链接为最后一个链接时,指向的是空值或空列表)。意思就是说双向链表有2个指针,一个是指向前一个节点的指针,另一个则指向后一个节点的指针。
4.循环链表
循环链表就是首节点和末节点被连接在一起。循环链表中第一个节点之前就是最后一个节点,反之亦然。
5.数组和链表的区别?
不同:链表是链式的存储结构;数组是顺序的存储结构。
链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
相同:两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。
6.链表的应用、代码实践
约瑟夫问题:
传说在公园1世纪的犹太战争中,犹太约瑟夫是公元一世纪著名的历史学家。在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人俘虏,于是决定了一个流传千古的自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从这个约定,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第_个和第_个位置,于是逃过了这场死亡游戏,你知道安排在了第几个嘛?
针对以上问题,使用单向循环链表的方式求解:
//节点类function Node(elemnt) {this.item = elemnt;this.next = null;}//循环列表需要修改一下构造函数,和遍历时候的判断条件//构造函数如下;希望从后向前遍历,又不想要建立双向链表,就使用循环链表。function Llist() {this.head = new Node("1");this.head.next = this.head;this.remove = remove;this.insert = insert;this.find = find;this.display = display;//..........}function find(number) {var curr = this.head;while (curr.item != number) {curr = curr.next;}return curr;}function insert(element, newElement) {var preNode = this.find(element);var current = new Node(newElement);current.next = preNode.next;preNode.next = current;}function remove() {var current = this.head;console.log("remove"); //跳过两个,杀死一个while(current.next.next != null && current.item!=current.next.next.item){var temp = current.next.next;current.next.next = temp.next;current = temp.next;temp.next = null;}return current;}function display(flag,current) {var crr = this.head; if(flag){while(crr.next.item!="1"){console.log(crr.item);crr=crr.next;}}else{ //最后只剩两个直接输出console.log(current.item);console.log(current.next.item);}}var Clist = new Llist();//输入排序for (var i = 1; i < 41; i++){Clist.insert(i.toString(),(i + 1).toString());}//先输出所有Clist.display(1,null);//通过remove返回最后杀死后的结果其中一个节点Clist.display(0,Clist.remove()); //16,31
组织代码的方式要学习体会;
7.自我理解
1)数组便于查询和修改,但是不方便新增和删除
2)链表适合新增和删除,但是不适合查询,根据业务情况使用合适的数据结构和算法是在大数据量和高并发时必须要考虑的问题
数组和链表的区别浅析相关推荐
- 算法与数据结构--数组和链表的区别
最近由于在找工作,经历了一些校招面试后,感觉在数据结构和操作系统上面,还有很多的欠缺.所以今天要学习一下数据结构.还是从面试的那到题开始. 数组和链表的区别? C和C++语言中用数组处理一组数据类型相 ...
- 数组和链表的区别以及应用场景
数组和链表的区别以及应用场景 首先我们要先理解什么是数组和链表 在计算机中要对给定的数据集进行若干处理,首要任务是把数据集的一部分(当数据量非常大时,可能只能一部分一部分地读取数据到内存中来处理)或全 ...
- 每日一题(41)—— 数组和链表的区别
数组和链表的区别: 数组:数据顺序存储,固定大小 连表:数据可以随机存储,大小可动态改变
- 20140617 数组和链表的区别
1.数组和链表的区别 逻辑结构方面: 数组:静态申请的连续的内存空间,编译阶段确定空间大小,运行阶段是不允许改变 链表:动态申请的内存空间,并不像数组一样需要事先申请好大小,链表是现用现申请就OK,根 ...
- php集合与数组的区别,php数组和链表的区别总结
PHP中数组和链表的区别 从逻辑结构来看 1..数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况.当数据增加时,可能超出原先定义的元素个数:当数据减少时,造成内存浪费:数组可以根据 ...
- 数据结构:数组和链表的区别以及各自的优缺点
原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自 ...
- php数组和链表的区别,什么是链表?链表与数组的区别?
链表的相关知识整理 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 ...
- 数据结构之数组和链表的区别
第一题便是数据结构中的数组和链表的区别 数组(Array) 一.数组特点: 所谓数组,就是相同数据类型的元素按一定顺序排列的集合:数组的存储区间是连续的,占用内存比较大,故空间复杂的很大.但数组的二分 ...
- 数组和链表的区别详解
目录 1.什么是数组和链表 2.数组和链表的区别 1.什么是数组和链表 数组介绍 数组:相同数据类型的元素按照一定的顺序排列的集合 数组本身属于引用数据类型,数组是由下标索引和data两部分组成. 数 ...
最新文章
- SAP HUM 内向交货单凭证流和Relationship Browser
- Android 如何在xmL 里面动态设置padding
- 使用 Source Generator 代替 T4 动态生成代码
- 修改hostname有几种方式?
- 在读博士练成健身达人,女大学生在宿舍练出八块腹肌……
- 输入课程信息的C语言代码,[源码和文档分享]基于C语言的课程信息管理系统
- SparkStreaming窗口入门
- BSB网络验证 易语言网络验证系统 autojs 网络验证系统 免费的卡密收费系统 账号注册系统
- MTK平台TP驱动详解
- 美国人口与种族变迁史
- 手机没网了,却还能支付,这是什么原理?
- linux ftp匿名用户,linux vsftp 匿名用户的设置
- 发票查验API可以查验的发票类型有哪些?
- 心态-《积极的力量》书中的精髓:如何保持积极乐观的心态,从而提升我们的幸福感?
- 流体渐变_最新的10种Fluid Colors流体渐变壁纸制作方法
- Multi class ovr or ovo
- Alfira学习篇(Python)
- 2022-01-05:有四种诗的韵律分别为: AABB、ABAB、ABBA、AAAA。 比如 : 1 1 3 3就属于AABB型的韵律、
- 美多商城项目订单和支付模块总结
- IOS 图标尺寸以及设备尺寸详解
热门文章
- Qt Java 实现短信群发功能 从搭建环境到功能实现
- 关系代数 域关系演算
- EXCEL--多条件3(if嵌套/判断)
- 全球同服--coc类游戏服务器架构
- MySQL 8.0 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- itertor与litertor的区别?
- IOS常用的文件管理
- 内存条相关参数查看方法
- 浅谈android,继续赶脚
- 没有学不会的知识,只有不努力的傻子!!! 学习的过程很痛苦,不学习的日子是苦难!!! 只要坚持就没有学不会的东西!!!...