为什么需要双向链表
对于单向链表来说,从链表的头节点遍历到尾节点很简单,但反过来,从后向前遍历则没那么简单。另外,删除节点时我们需要借助于findPrevious这样一个辅助方法来实现,显得很繁琐。(此文章是对上一篇文章的后续,点击此处进入上一篇文章)
双向链表的实现
首先Node类需要增加一个previous属性:
function Node(element) { this.element = element; this.next = null; this.previous = null; }insert方法需要添加previous属性,使其指向该节点的前驱:
insert: function(newElement, item) { var newNode = new Node(newElement); var current = this.find(item); newNode.next = current.next; newNode.previous = current; current.next = newNode; }remove方法将不再依赖于findPrevious方法,只需要在链表中找出存储待删除数据的节点,然后设置该节前驱的 next 属性,使其指向待删除节点的后继;设置该节点后继的 previous 属性,使其指向待删除节点的前驱。如下图所示:
remove: function(item) { var currNode = this.find(item); if (!(currNode.next == null)) { currNode.previous.next = currNode.next; currNode.next.previous = currNode.previous; currNode.next = null; currNode.previous = null; } }增加反序显示链表的方法dispReverse:
//我们需要一个工具方法findLast来查找链表中的最后一个节点 findLast: function() { var currNode = this.head; while (!(currNode.next == null)) { currNode = currNode.next; } return currNode; } //反序显示链表数据 dispReverse: function() { var currNode = this.head; currNode = this.findLast(); while (!(currNode.previous == null)) { console.log(currNode.element); currNode = currNode.previous; } }完整的双向链表实现代码:
//节点类 function Node(element) { this.element = element; this.next = null; this.previous = null; } //链表类 function LList() { this.head = new Node("head"); } LList.prototype={ //反向显示所有节点 dispReverse:function(){ var currNode = this.head; currNode = this.findLast(); while (!(currNode.previous == null)) { console.log(currNode.element); currNode = currNode.previous; } }, //查找尾节点 findLast:function(){ var currNode = this.head; while (!(currNode.next == null)) { currNode = currNode.next; } return currNode; }, //删除节点 remove:function(item){ var currNode = this.find(item); if (!(currNode.next == null)) { currNode.previous.next = currNode.next; currNode.next.previous = currNode.previous; currNode.next = null; currNode.previous = null; } }, //查找节点 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; newNode.previous = current; current.next = newNode; }, //正常显示所有节点 display:function() { var currNode = this.head; while (!(currNode.next == null)) { console.log(currNode.next.element); currNode = currNode.next; } } }
测试:
var lk=new LList(); //添加4个节点 lk.insert("likek","head"); lk.insert("zhangsan","likek"); lk.insert("lisi","zhangsan"); lk.insert("wangba","lisi"); //正常显示 lk.display(); /*likek zhangsan lisi wangba*/ //反向显示 lk.dispReverse(); /*wangba lisi zhangsan likek*/ //删除节点 lk.remove("lisi"); lk.display(); /*likek zhangsan wangba*/
相关推荐
《数据结构与算法(Java版-英文)》一书由Robert Lafore撰写,是一本针对数据结构和算法的深入解析指南,特别适用于那些已经掌握基本编程技能并希望进一步提升自己在数据处理方面能力的读者。本书采用Java语言作为...
《数据结构与算法JavaScript描述》是一本深入探讨计算机科学核心概念——数据结构和算法的书籍,特别使用JavaScript作为实现语言。这本书是图灵程序设计丛书中的一部,旨在帮助读者理解并掌握如何用动态且直观的方式...
在JavaScript中,数据结构是构建复杂程序的基础,其中双向链表和双向循环链表是两种重要的线性数据结构。本文将深入探讨这两种链表的实现原理,并通过代码示例进行详细解析。 首先,双向链表(Doubly Linked List)...
在JavaScript编程中,掌握数据结构和算法是提升代码效率和逻辑清晰度的关键。在这个主题下,我们将深入探讨四种基本的数据结构——链表、栈、队列以及基础的排序和查找算法。这些概念不仅在日常开发中广泛应用,也是...
《JavaScript数据结构与算法》是一本专为JavaScript开发者设计的深度学习资料,旨在提升开发者对数据结构和算法的理解与应用能力。数据结构是计算机存储、组织数据的方式,而算法则是解决问题的具体步骤,两者是编程...
本资料包“数据结构-使用javascript讲解数据结构之链表.zip”将深入探讨链表的概念、实现以及其在JavaScript中的应用。 链表不同于数组,数组是连续的内存空间,而链表的元素在内存中是非连续存储的。每个元素称为...
本压缩包文件"数据结构与算法javascript学习代码实现.zip"包含了对这一主题的深入探讨,特别是通过实际的JavaScript代码实现来加深理解。 1. **数组(Array)**:JavaScript中最基础的数据结构,用于存储一组有序的...
这个压缩包文件“通过JavaScript来封装实现常见的数据结构与算法.zip”显然是一个学习资源,它可能包含了多种常见数据结构(如数组、链表、栈、队列、树等)以及算法(如排序、搜索、图算法等)的JavaScript实现。...
JavaScript 数据结构与算法是编程领域中的基础,它们是构建高效程序和解决复杂问题的关键工具。在JavaScript中,我们经常使用的数据结构包括数组、栈、队列、链表等。 1. **数组**:数组是最基本的数据结构,它可以...
接下来就是介绍两种常见的链表: 单向链表,双向链表在JavaScript中的实现。 单向链表 链表中最简单的形式就是单向链表,链表中的节点都包含两个部分,第一部分储存着自身信息,第二部分则储存有指向下一节点的指针...
链表是一种重要的数据结构,它在计算机科学中广泛应用于各种算法和数据结构的实现。相对于数组,链表在处理动态数据变化时具有显著优势。在JavaScript中,由于数组的优化,如快速的push、pop、shift和unshift等操作...
### 数据结构与算法(JAVA语言版) #### Java与面向对象程序设计 - **Java语言基础知识** - **基本数据类型及运算**: - Java语言规定所有变量在使用之前必须明确其类型。Java具备八种基本的数据类型,分为四类...
通过以上分析,我们了解了如何使用JavaScript实现链表数据结构,并进行了插入、删除操作以及回文检测的功能。链表是一种非常实用的数据结构,广泛应用于计算机科学的多个领域。掌握链表的基本操作对于理解和设计高效...
通过JavaScript来封装实现常见的数据结构与算法 介绍 收录了各种常见的数据结构与算法通过 JavaScript 来封装的代码,可以直接拿取使用 注意 现在暂未更新完,进度会随着本人CSDN博客上的文章进度而更新,欢迎大家...
本篇文章将深入探讨在PHP中如何理解和实现各种重要的数据结构与算法。我们将会从数组、链表到更复杂的树形结构以及堆和散列表等进行逐一解析,并通过实际代码示例来帮助读者更好地掌握这些核心概念。 #### 数组...
在TypeScript中实现数据结构和算法是一门深入编程技术的重要课题。TypeScript是JavaScript的一个超集,它提供了静态类型、接口、泛型等强大的特性,使得编写高效且可维护的代码变得更加容易。在这个名为"Data-...
"用各种不同的语言实现算法和数据结构集合"这个项目旨在提供一个跨语言的学习资源,帮助开发者深入理解这些核心概念,并提升编程能力。这里我们将专注于JavaScript开发中的数据结构部分。 数据结构是组织、管理和...
LRU(Least Recently Used,最近最少使用)...总结,LRU算法在JavaScript中的实现涉及到数据结构的设计和操作,包括哈希表和双向链表。通过这种方式,我们可以高效地管理资源,优化性能,尤其是在内存受限的场景下。