链表有单向链表、双向链表和循环链表,此篇文章只讲解单向链表,另外两种会在下一篇文章中补充,要真正理解和使用链表的话,建议三种链表结构都了解一下。
平时我们使用最多的数据结构应该是数组,很多东西都可以用数组来轻松实现,但在某些编程语言中,数组的长度是预先设定好的,想要额外添加元素或者删除元素是一件比较困难的事。那么使用链表的话恰恰就解决了这些问题,对于链表来说删除或添加一个元素是非常方便的,除了数据的随机访问(可以实现但是比较麻烦,比如可以通过添加和操作索引值来实现),它几乎可以用在任何可以使用一维数组的情况中。
链表的定义
链表是由一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一
个节点的引用叫做链。
一般的链表都会额外添加一个头节点(作为辅助)和尾节点,例如下面这种样子
数组元素靠它们的位置进行引用,链表元素则是靠相互之间的关系进行引用。在上图中,我们说 bread 跟在 milk 后面,而不说 bread 是链表中的第二个元素。遍历链表,就是跟着链接,从链表的首元素一直走到尾元(但这不包含链表的头节点,头节点常常用来作为链表的接入点)。上图中另外一个值得注意的地方是,链表的尾元素指向一个 null 节点。
插入新元素:
向单向链表中插入一个节点,只需要修改它前面的节点(前驱),使其指向新加入的节点,而新加入的节点则指向原来前驱指向的节点。上图演示了如何在 eggs 后加入 cookies。
删除链表中已有元素:
从链表中删除一个元素也很简单。只需要将待删除元素的前驱节点指向待删除元素的后继节点。上图展示了从单向链表中删除Bacon。
除了插入和删除,链表还有其他一些操作,后面将给出讲解。
设计一个基于对象的链表
我们需要设计两个类,Node 类用来表示节点, LinkedList 类提供插入节点、删除节点、显示列表元素的方法,以及其他一些辅助方法。
Node类:
function Node(element) { this.element = element;//当前节点的数据 this.next = null;//下一个节点数据 }
LinkedList 类:
function LList() { this.head = new Node("head");//头节点 } LList.prototype={ //查找某一节点 find:function (item) { var currNode = this.head; while (currNode.element != item) { currNode = currNode.next; } return currNode; }, //向某一元素后面插入新节点 insert:function(newElement,item){ var newNode = new Node(newElement); var current = this.find(item); newNode.next = current.next; current.next = newNode; }, //查找某一节点的前一个节点(前驱) findPrevious:function(item){ var currNode = this.head; while (!(currNode.next == null) &&(currNode.next.element != item)) { currNode = currNode.next; } return currNode; }, //删除某一个节点 remove:function(item){ var prevNode = this.findPrevious(item); if (!(prevNode.next == null)) { prevNode.next = prevNode.next.next; } }, //修改某一节点的数据 edit:function(item,newItem){ var element=this.find(item); element.element=newItem; }, //在控制台打印出所有节点(为了方便预览) display:function(){ var currNode = this.head; while (!(currNode.next == null)) { console.log(currNode.next.element); currNode = currNode.next; } } }
测试:
var names = new LList(); names.insert("likek", "head");//往头节点后插入节点likek names.insert("zhangsan", "likek");//往likek后插入节点zhangsan names.insert("lisi", "zhangsan");//往zhangsan后插入节点lisi names.insert("wangwu", "lisi");//往lisi后插入节点wangwu names.display(); /*likek zhangsan lisi wangwu*/ names.remove("zhangsan");//删除zhangsan节点 names.display(); /*likek lisi wangwu*/ names.edit("lisi","wangnima");//将lisi节点改为wangnima names.display(); /*likek wangnima wangwu*/
相关推荐
《数据结构与算法(Java版-英文)》一书由Robert Lafore撰写,是一本针对数据结构和算法的深入解析指南,特别适用于那些已经掌握基本编程技能并希望进一步提升自己在数据处理方面能力的读者。本书采用Java语言作为...
《数据结构与算法JavaScript描述》是一本深入探讨计算机科学核心概念——数据结构和算法的书籍,特别使用JavaScript作为实现语言。这本书是图灵程序设计丛书中的一部,旨在帮助读者理解并掌握如何用动态且直观的方式...
本资料包“数据结构-使用javascript讲解数据结构之链表.zip”将深入探讨链表的概念、实现以及其在JavaScript中的应用。 链表不同于数组,数组是连续的内存空间,而链表的元素在内存中是非连续存储的。每个元素称为...
在JavaScript编程中,掌握数据结构和算法是提升代码效率和逻辑清晰度的关键。在这个主题下,我们将深入探讨四种基本的数据结构——链表、栈、队列以及基础的排序和查找算法。这些概念不仅在日常开发中广泛应用,也是...
《JavaScript数据结构与算法》是一本专为JavaScript开发者设计的深度学习资料,旨在提升开发者对数据结构和算法的理解与应用能力。数据结构是计算机存储、组织数据的方式,而算法则是解决问题的具体步骤,两者是编程...
本压缩包文件"数据结构与算法javascript学习代码实现.zip"包含了对这一主题的深入探讨,特别是通过实际的JavaScript代码实现来加深理解。 1. **数组(Array)**:JavaScript中最基础的数据结构,用于存储一组有序的...
接下来就是介绍两种常见的链表: 单向链表,双向链表在JavaScript中的实现。 单向链表 链表中最简单的形式就是单向链表,链表中的节点都包含两个部分,第一部分储存着自身信息,第二部分则储存有指向下一节点的指针...
在JavaScript中实现常见的数据结构与算法是提升编程能力的重要步骤,尤其对于大学生而言,这是数据结构学习的关键部分。数据结构是组织和管理大量数据的方法,而算法则是解决特定问题的步骤集。本压缩包文件“通过...
在深入了解JavaScript中的单链表和循环链表的实现之前,我们需要先了解数据结构的基本概念。数据结构是计算机存储、组织数据的方式,它有助于更高效地访问和修改数据。数据结构分为线性和非线性两大类,而链表属于非...
通过以上分析,我们了解了如何使用JavaScript实现链表数据结构,并进行了插入、删除操作以及回文检测的功能。链表是一种非常实用的数据结构,广泛应用于计算机科学的多个领域。掌握链表的基本操作对于理解和设计高效...
在TypeScript中实现数据结构和算法是一门深入编程技术的重要课题。TypeScript是JavaScript的一个超集,它提供了静态类型、接口、泛型等强大的特性,使得编写高效且可维护的代码变得更加容易。在这个名为"Data-...
"用各种不同的语言实现算法和数据结构集合"这个项目旨在提供一个跨语言的学习资源,帮助开发者深入理解这些核心概念,并提升编程能力。这里我们将专注于JavaScript开发中的数据结构部分。 数据结构是组织、管理和...
本篇文章将深入探讨在PHP中如何理解和实现各种重要的数据结构与算法。我们将会从数组、链表到更复杂的树形结构以及堆和散列表等进行逐一解析,并通过实际代码示例来帮助读者更好地掌握这些核心概念。 #### 数组...
在JavaScript中,单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。这种数据结构在处理动态数据集合时特别有用,因为它允许快速插入和删除操作。下面我们将...
本压缩包“用JavaScript实现的算法和数据结构,附详细解释和刷题指南.zip”显然是为了帮助开发者深入理解并掌握JavaScript中的算法与数据结构,这对于提升编程能力至关重要。 数据结构是计算机科学的基础,它涉及...
链表包括单向链表、双向链表和循环链表等,理解和实现链表的插入、删除操作是算法设计的关键。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,Java中的`java.util.Stack`类提供了栈的实现。掌握栈的基本操作,如...
在这个"数据结构源码JS实现.zip"压缩包中,包含了多种经典数据结构的JavaScript实现,这对于理解和掌握这些概念至关重要。以下是对每个文件内容的详细解释: 1. **二叉搜索树**(Binary Search Tree, BST):这是一...
在JavaScript中,数据结构是构建复杂程序的基础,其中双向链表和双向循环链表是两种重要的线性数据结构。...理解并掌握这些数据结构的实现原理,有助于提升JavaScript编程能力,优化算法效率,解决复杂问题。