`

链表(JavaScript实现)

阅读更多

1.简介   

    其实在大学的时候就已经学过数据结构了,不过当时是C语言版的,如今有时间就又重新复习一遍,补一下基础,这次打算用js实现,知识点都是相同的,只不过是实现方式不同而已。

    

   
栈和队列相对比较简单,用jsArray对象的pushpopshiftunshift就可以模拟,也是最常用的数据结构,比如要存储多个元素,用数组就十分方便。但是数组的大小是固定的,从数组的中间插入或删除一条元素的代价比较高,需要移动元素,尽管jsArraysplice就可以简单实现,但背后的实现原理还是一样的。

链表存储有序的元素的集合,它不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指针指向下一个元素的引用组成。

 

了解了链表的基本结构后,那么就开始用代码实现下吧。

    function Node(data){
      this.data = data;
      this.next = null;
    }

     function LinkedList(){
 		this.length = 0;
 		this.head = null;
     }
 	LinkedList.prototype = {
 		constructor:'LinkedList',
                //向末尾追加一个元素
 		append:function(element){},
                //向指定位置插入一个元素
 		insert:function(postion,element){},
                 //指定位置删除一个元素
 		removeAt:function(postion){},
                 //删除指定的节点
 		remove:function(element){},
               //返回元素在链表中的位置
               indexOf:function(element){},
               //链表是否为空
               isEmpty:function(){},
               getLength:function(){}
 	}

 

2.追加一个节点

   向LinkedList对象尾部添加一个元素时,可能有两种情景:列表为空,添加的是第一个元素,或者列表不为空,向其追加元素。

append:function(element){
 var node = new Node(element),
     current;
 if(this.head == null){
 	this.head = node;
 }else{
 	current = this.head;
 	while(current.next){
 		current = current.next;
 	}
 		current.next = node;
 }
 	this.length++;
}

 结果如下:


 现在我们可以成功创建一个链表啦。

 

2.链表的删除操作

 

    删除操作也有两种情况:头结点和非头结点。我们要实现两种remove方法:第一种从特定位置移除,第二种指定元素移除。

下面是根据给定位置移除一个元素的方法实现:

removeAt:function(postion){
 	//边界检查
 	if(postion>=0 && postion<=this.length){
 		var current = this.head,
 		    index = 0,
                   //用于保存前一个节点
 		    previous;
 		if(postion == 0){
 			this.head = current.next;
 		}else{
                     //否则循环找到指定位置
 			while(index++ < postion){
 			    previous = current;
 			    current = current.next;
 			}

 			previous.next = current.next;
 		}
 			this.length--;
 			return current.data;
 	}else{
 			return null;
 	}
}

 
 3.插入操作

 

 代码具体实现如下,应该很好理解.

 

insert:function(postion,element){
 	//越界判断
 	if(postion>=0 && postion<=this.length){
	     var node = new Node(element),
	         current = this.head,
	         index = 0,
	 	 //用于保存前一个节点
	 	 previous;
	 	//在头部之前插入
	 	if(postion == 0){
	 		node.next = current;
	 		this.head = node;
	 	}else{
	 		while(index++<postion){
	 			 previous = current;
	 			 current = current.next;
	 		}
	 		node.next = current;
	 		previous.next = node;
	 	 }
	 		this.length++;
	 		 return true;
 	}else{
 		return false;
 	}
 		}

 4.其他实现方法

   isEmpty(),getSize(),toString()等等实现就比较简单了

5.约瑟夫环问题实现

   约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

var Josephus = {
 		init:function(){
 			this.suicideNum = 3; //第几个自杀
 			this.createCircle();
 			this.suicide();
 		},
 		createCircle:function(){
 			this.linkedList = new LinkedList();
 			for(var i = 0;i<10;i++){
 				this.linkedList.append(i+1);
 			}
 			this.linkedList.setCircle();
 		},
 		suicide:function(){
 			var current = this.linkedList.head,
 				previous = current;
 			for(var i = 0;i<this.linkedList.length;i++){	
			        //最后剩下两个人
 				if(i == this.suicideNum-1 && this.linkedList.length>2){			
 					previous.next = current.next;
 					console.log("第 "+current.data + " 自杀");
 					current = current.next;
 					--this.linkedList.length;
 					i = -1;		
 				}else{
 					previous = current;c
 					current = current.next;
 				}
 				
 			}
 			this.linkedList.toString();
 		}
 	}
 

单链表的操作就简单介绍到这里,后面还有双链表稍微复杂一点

  • 大小: 9.2 KB
  • 大小: 12.9 KB
  • 大小: 10.7 KB
  • 大小: 17.3 KB
  • 大小: 96.1 KB
分享到:
评论

相关推荐

    JavaScript数据结构之链表的实现

    在JavaScript中,链表的实现通常涉及到节点类(Node)和链表类(LinkedList)的设计。 节点类(Node)通常包含两个属性:`element`用于存储节点的数据,`next`用于指向下一个节点的引用。例如: ```javascript ...

    javascript链表可视化

    JavaScript链表可视化是一种将抽象的数据结构通过直观的图形方式展示出来的方法,这有助于开发者更好地理解和操作数据。在本项目中,我们使用了jQuery库来实现这一功能,它提供了丰富的DOM操作和事件处理,使得动态...

    linkedList:javascript中的链表实现

    链表javascript中的链表实现请通过 mocha 测试文档npm 测试链表堆栈: ✓ allows adding elements through array inside constructor ✓ allows adding elements ✓ allows taking out elements at top ✓ has an ...

    JavaScript 实现基础 LinkedList 功能

    以上就是一个基础的JavaScript实现的LinkedList。在实际应用中,还可以扩展其他功能,比如在指定位置插入元素、反转链表、判断链表是否有环等。链表是数据结构的基础,理解和熟练掌握其原理和实现对于提升JavaScript...

    JavaScript数据结构之单链表和循环链表

    在深入了解JavaScript中的单链表和循环链表的实现之前,我们需要先了解数据结构的基本概念。数据结构是计算机存储、组织数据的方式,它有助于更高效地访问和修改数据。数据结构分为线性和非线性两大类,而链表属于非...

    JavaScript实现链表插入排序和链表归并排序

    在本篇技术文档中,介绍了如何使用JavaScript实现链表的两种常见排序算法:链表插入排序和链表归并排序。这两种排序算法在数据结构中占据着重要的位置,尤其是在链表这种非连续存储的数据结构中。下面详细介绍这两种...

    JavaScript数据结构之双向链表和双向循环链表的实现

    以下是一个简单的JavaScript实现双向链表的代码: ```javascript function DoublyLinkedList() { var Node = function(element) { this.element = element; this.next = null; this.prev = null; }; var ...

    去除链表重复元素- JavaScript版

    附件包含去除链表重复元素_ JavaScript版,文件绿色...在 JavaScript 中,处理链表并去除其中的重复元素通常需要定义一个链表节点类(Node)以及链表类(LinkedList),然后实现一个方法来遍历链表并去除重复的元素。

    js实现链表

    javascript实现链表的功能。可以解决相应问题。

    各种javascript列表的实现

    本篇文章将深入探讨JavaScript中的各种列表实现,包括数组、链表、队列、栈等,并通过具体实例来阐述它们的用法和特点。 首先,我们最常接触的是JavaScript的内置数据结构——数组(Array)。数组是一个可变大小的...

    数据结构-使用javascript讲解数据结构之链表.zip

    本资料包“数据结构-使用javascript讲解数据结构之链表.zip”将深入探讨链表的概念、实现以及其在JavaScript中的应用。 链表不同于数组,数组是连续的内存空间,而链表的元素在内存中是非连续存储的。每个元素称为...

    DWR实现的三级联动链表的例子

    3. **JavaScript实现**:在HTML页面中,使用DWR生成的JavaScript代码来监听一级分类的选择事件。当选择改变时,调用`getLevel2Categories()`并传入选择的一级分类ID,得到的二级分类列表更新到二级下拉框。同样,二...

    JS实现链表,前端必会

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在JavaScript这样的编程语言中。在前端开发中,理解并能实现链表可以帮助我们更好地处理动态数据集合,例如在实现某些高级数据结构(如堆栈...

    基于javascript实现的一些数据结构

    本资源“基于javascript实现的一些数据结构”很可能包含了一系列JavaScript实现的经典数据结构,如数组、链表、栈、队列、哈希表、树、图等。下面我们将详细探讨这些数据结构及其在JavaScript中的应用。 1. **数组*...

    JavaScript版去除链表重复元素

    在 JavaScript 中,处理链表并去除其中的重复元素通常需要定义一个链表节点类(Node)以及链表类(LinkedList),然后实现一个方法来遍历链表并去除重复的元素。 文件绿色安全,仅供学习交流使用,欢迎大家下载学习...

    js单向链表的具体实现实例

    在给出的知识点中,涉及到的是JavaScript编程语言中实现单向链表的数据结构,以及在此数据结构上实现的一系列操作,包括排序、增加、查找和删除节点的方法。 首先,我们来解析一下单向链表的节点类`linkNode`,在给...

    JavaScript实现不同的计算机科学算法

    在这个“JavaScript实现不同的计算机科学算法”的项目中,我们可以通过`javascript-algorithms-master`这个压缩包来学习如何在JavaScript中实现这些算法。 1. **排序算法** - **冒泡排序**:是最简单的排序算法之...

    【JavaScript源代码】JavaScript数据结构之双向链表.docx

    下面我们将详细介绍如何在 JavaScript 中实现双向链表。 1. **定义节点构造函数**: 首先,我们需要定义一个`Node`类来表示双向链表中的节点。每个节点包含三个属性:`element`用于存储节点数据,`next`用于指向...

    js线性表插件 数组,链表,简单实现.rar

    本压缩包包含的是JavaScript对线性表的四种基本实现:数组、单链表、单向循环链表和双向链表。下面我们将详细探讨这些数据结构及其实现。 1. **数组实现**: 数组是最直观的线性表实现方式,JavaScript中的数组...

    JavaScript实现的3D球面标签云效果

    在本项目中,"JavaScript实现的3D球面标签云效果"是一个利用JavaScript创建的动态视觉效果,它将关键词或文字以3D形式展示在球面上,为用户带来新颖且互动的体验。 实现这个效果的关键技术主要包括以下几个方面: ...

Global site tag (gtag.js) - Google Analytics