创建 js链表

本文详细介绍了链表的概念,包括链表中元素在内存中的分布以及单向链表和双向链表的区别。通过JavaScript代码展示了如何创建链表节点类和链表类,并提供了添加节点、获取节点以及通过值查找节点的方法。此外,还给出了双向链表的实现思路,强调了双向链表可以双向遍历的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是链表:链表中的元素在内存中并不是连续的,每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也可以称为指针)组成

链表被分为单向链表与双向链表;

单向链表中每一个元素只有一个next指针,用来指向下一节点,我们只能从链表的头部开始遍历整个链表,任何节点只能找到它的下一个节点,而不能找到它的上一个节点,

双向链表中的每一个元素拥有两个指针,一个用来指向下一个节点,一个用来指向上一个节点,双向链表中除了可以向单向链表一样从头部开始遍历外,还可以从尾部开始遍历;

在js这门语言中我们怎么表示链表呢,因为js中没有内置链表这种数据结构;所以我们需要创建一个类,这个类的作用就是描述链表的节点;

单向链表:

一个保存节点的值,一个保存指向下一个节点的指针;

function  listNode(val){
       this.val=val // 节点的值
       this.next=null  //指向下一个节点的指针;
   }

 //写一个链表类,其中length属性代表链表长度,head属性代表链表头部节点;
   function LinkedList(){
       this.length=0
       this.head=null
   }

这是向单向链表追加节点:分为两种情况,一种是链表中没有值时,一种是链表有值:

//向链表中追加节点;分为两种情况一种是链表中没有值时,一种是链表有值;
       LinkedList.prototype.append=function(val){
           let node=new listNode(val)
           //链表为空时
           if(!this.head){
               this.head=node
           }else{
               let cur=this.getElementAt(this.length-1)
               cur.next=node
               //指针指向我新添加的节点;
           }
           //将链表长度加1;保证length属性等于链表长度;
           this.length++
       }
     
         //获取链表中索引所对应的元素;
    LinkedList.prototype.getElementAt = function (index) {
        //判断参数index的边界值,如果值超出索引的范围(<0||>length-1) 
        if (index < 0 || index >= this.length) return null
        let cur = this.head
        while (index--) { //这里自减是因为链表的索引是从0开始的
            cur = cur.next
        }
        return cur
    }

通过节点值查找元素:

/find方法;通过节点值找元素
    LinkedList.prototype.find = function (val) {
        let cur = this.head
        while (cur) {
            if (cur.val == val) return cur
            cur = cur.next
        }
        return null
    }

使用链表:

 let Linked = new LinkedList()
        Linked.append(20);
        Linked.append(17);
        Linked.append(30);
        console.log(Linked.join('--')); //20--17--30

 双向链表:

创建一个双向链表:

创建链表节点类,不同的是,它需要多一个 prev 属性用来指向前一个节点

function listNodenod(val){
    this.val=val
    this.next=null
    this.prev=null
}
//创建链表节点类,不同的是,它需要多一个 prev 属性用来指向前一个节点

function DoubleLinkedList(){
    this.length=0
    this.head=null
    this.tail=null
}

### 如何在 JavaScript创建链表 #### 链表简介 链表是一种常见的数据结构,由一系列节点组成。每个节点包含两个部分:存储的数据和指向下一个节点的指针。这种结构允许动态分配内存并灵活管理数据。 #### 节点定义 为了构建链表,首先需要定义一个 `Node` 类来表示单个节点。该类通常有两个属性:一个是保存实际数据的字段 (`value`),另一个是指向下一节点的引用 (`next`)。 ```javascript class Node { constructor(value) { this.value = value; this.next = null; // 初始时没有后续节点 } } ``` 此代码片段展示了如何通过构造函数初始化一个新的节点对象[^1]。 #### 创建链表 接下来,可以定义一个 `LinkedList` 类用于管理和操作整个链表。这个类应至少具有以下几个方法: - **append**: 向列表末尾添加新节点。 - **printList**: 打印当前链表中的所有值以便调试或验证功能。 以下是完整的实现及其解释: ```javascript class LinkedList { constructor() { this.head = null; // 初始化为空头结点 this.tail = null; // 尾部也设为null } append(value) { const newNode = new Node(value); // 使用之前定义好的Node类实例化新的节点 if (!this.head) { this.head = newNode; // 如果头部不存在,则设置第一个元素作为head this.tail = newNode; // 并且此时tail也是同一个node } else { this.tail.next = newNode; // 当前最后一个节点连接到新增加的那个上 this.tail = newNode; // 更新tail位置至最新加入者处 } } printList() { let currentNode = this.head; while (currentNode !== null){ console.log(currentNode.value); currentNode = currentNode.next; } } } ``` 上述代码实现了基本的功能需求,并提供了清晰易懂的操作方式。 #### 测试链表 下面是如何测试我们刚刚建立起来的基础版双向循环型链表的一个例子: ```javascript let myList = new LinkedList(); myList.append(5); myList.append(10); myList.append(15); console.log('Linked List Values:'); myList.printList(); // 输出应该是依次显示 5 -> 10 -> 15 ``` 这段脚本先建立了三个数值分别为5、10 和 15 的节点并将它们按顺序链接在一起形成一条线性的链条;最后调用了打印方法展示这些已存入的内容。 ### 总结 以上就是在JavaScript里边怎样去搭建起属于自己的简单版本单向非循环类型的链式储存体系——即所谓的“链表”。它不仅有助于理解更复杂的数据结构概念,而且对于日常编程实践也有很大帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值