数组和链表的区别浅析

数组和链表的区别浅析1.链表是什么链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。所以,链表允许插入和删…

大家好,又见面了,我是你们的朋友全栈君。

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)链表适合新增和删除,但是不适合查询,根据业务情况使用合适的数据结构和算法是在大数据量和高并发时必须要考虑的问题

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147716.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 详解DOM对象中clientWidth、offsetWidth等属性

    详解DOM对象中clientWidth、offsetWidth等属性我们有时需要获得鼠标在某盒子中的位置,或者是随意移动某盒子的位置,在这些场景中我们可能经常需要用到clientWidth、offsetWidth、offsetTop啊等等。但是对于初学者来说(包括我),看到这些就头疼,因为感觉意思都相近,但作用却不同,所以今天天我就来捋一捋,搞清楚,后面好干活。好吧,废话不多说,开始吧。先上一下示例代码,下面要用到。HTML:…

  • PMF 培训[通俗易懂]

    PMF 培训[通俗易懂]IBM有一些很有名的培训,也很有效,真的是有立竿见影的效果.过去很长时间之后,可能不记得培训的那些细节,但是培训中传达的工作方式,能给你很大的影响.进公司后3个月的时候接受了第一个,有关customerfacing的,其实是为你提供了一个商务沟通的基本模式,现在培训的内容忘记了,但是这个模式还记得:调查-承诺-执行-反馈.一个有效的商务沟通,哪怕是和客户的一个电话,都需要艺…

  • 前端安全XSS和XSRF[通俗易懂]

    前端安全XSS和XSRF[通俗易懂]安全问题:常见的web前端攻击方式有哪些XSS跨站请求攻击XSRF跨站请求伪造XSS跨站请求攻击博客前端界面嵌入script脚本脚本内容:获取cookie发送到服务器(服务器配合跨域)发布博客,有人查看,可以轻松获取查看人的cookie信息XSS预防替换特殊字符。例如:<变成&It;>变成&gt,那么script就不会作为脚本执行可以使用https://www.npmjs.com/package/xss的xss工具XSRF跨站请求伪造(类似于钓鱼

  • 免root虚拟框架_手机免root框架

    免root虚拟框架_手机免root框架安卓设备怎么无需root激活Xposed框架的步骤

  • 数据库服务器系统,数据库服务器的操作系统

    数据库服务器系统,数据库服务器的操作系统

    2021年11月28日
  • OpenCV-Python实战(1)——OpenCV简介与图像处理基础

    OpenCV-Python实战(1)——OpenCV简介与图像处理基础OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时也提供了Python接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍OpenCV库,包括它的主要模块和典型应用场景,同时使用OpenCV-Python实战讲解图像处理基础要点。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号