JavaScript数据结构之链表各种操作详解

JavaScript数据结构之链表各种操作详解

链表是一种常见的数据结构,常用于实现栈和队列等数据结构。链表与数组不同,链表是一种动态数据结构,可以方便地插入和删除数据。下面将详细讲解JavaScript中链表的各种操作。

链表的基本结构

链表由一个个节点组成,每个节点包含两个部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。

下面是一个节点的定义:

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

其中,data表示节点的数据,next指向下一个节点的地址。如果nextnull则表示链表的末尾。

整个链表可以用一个头节点来表示。头节点不包含数据,只包含指针,指向第一个节点。

下面是一个头节点的定义:

class LinkedList {
  constructor() {
    this.head = null;
  }
}

链表的各种操作

在链表末尾添加节点

在链表末尾添加节点是一种常见的操作。实现方法如下:

LinkedList.prototype.append = function(data) {
  let node = new Node(data);
  if (this.head === null) {
    this.head = node;
  } else {
    let current = this.head;
    while (current.next !== null) {
      current = current.next;
    }
    current.next = node;
  }
};

上述代码中,如果链表为空,则直接将新节点设置为头节点。否则,遍历链表,找到链表末尾,将新节点添加到末尾。

在链表头部添加节点

在链表头部添加节点也常常用到。可以通过如下方式实现:

LinkedList.prototype.prepend = function(data) {
  let node = new Node(data);
  node.next = this.head;
  this.head = node;
};

在添加一个节点时,先将新节点的next指向当前头节点,然后将新节点设置为头节点。

在指定位置插入节点

如果要在链表的指定位置插入数据,可以通过如下方式实现:

LinkedList.prototype.insert = function(data, position) {
  let node = new Node(data);
  if (position === 0) {
    this.prepend(data);
  } else {
    let current = this.head;
    let index = 0;
    while (index < position - 1) {
      current = current.next;
      index++;
    }
    node.next = current.next;
    current.next = node;
  }
};

如果需要在头部插入,可以调用prepend方法。否则,需要遍历链表,找到插入位置,然后将新节点插入到链表中。

遍历链表

遍历链表可以通过如下方式实现:

LinkedList.prototype.traverse = function() {
  let current = this.head;
  while (current !== null) {
    console.log(current.data);
    current = current.next;
  }
};

这个方法通过循环,从头节点开始遍历整个链表,并输出每个节点的数据。

查找节点

如果需要查找链表中的某个节点,可以通过如下方式实现:

LinkedList.prototype.indexOf = function(data) {
  let current = this.head;
  let index = 0;
  while (current !== null) {
    if (current.data === data) {
      return index;
    }
    current = current.next;
    index++;
  }
  return -1;
};

这个方法遍历整个链表,查找某个节点的数据是否等于指定的数据。如果找到则返回节点的索引,否则返回-1。

删除节点

删除节点也是链表中的一种常见操作,可以通过如下方式实现:

LinkedList.prototype.delete = function(data) {
  if (this.head === null) {
    return;
  }
  if (this.head.data === data) {
    this.head = this.head.next;
    return;
  }
  let current = this.head;
  while (current.next !== null) {
    if (current.next.data === data) {
      current.next = current.next.next;
      return;
    }
    current = current.next;
  }
};

如果需要删除头节点,直接将头节点指向下一个节点即可。否则需要遍历链表,找到要删除的节点,然后删除它。

示例说明

示例1:用链表实现栈

链表可以方便地实现栈和队列等数据结构。下面示范通过链表实现栈的方式:

class Stack {
  constructor() {
    this.list = new LinkedList();
  }

  push(data) {
    this.list.prepend(data);
  }

  pop() {
    let head = this.list.head;
    if (head === null) {
      return null;
    }
    this.list.head = head.next;
    return head.data;
  }

  isEmpty() {
    return this.list.head === null;
  }

  size() {
    let current = this.list.head;
    let count = 0;
    while (current !== null) {
      count++;
      current = current.next;
    }
    return count;
  }
}

可以看到,这个栈类内部使用链表来存储数据。push方法将新的元素添加到链表头部,pop方法将链表的头节点弹出,并返回节点的数据。isEmpty方法用来判断栈是否为空,size方法返回栈的元素个数。

示例2:通过链表实现一元多项式

链表还可以用来实现一元多项式。一元多项式可以表示为:

a0 + a1x + a2x² + ... + anxⁿ

这个式子中,a0 ~ an表示系数,x表示未知数,n表示项数。

下面是一个用链表实现一元多项式的示例:

class Node {
  constructor(coef, exp) {
    this.coef = coef;
    this.exp = exp;
    this.next = null;
  }
}

class Polynomial {
  constructor() {
    this.head = null;
  }

  append(coef, exp) {
    let node = new Node(coef, exp);
    if (this.head === null) {
      this.head = node;
    } else {
      let current = this.head;
      while (current.next !== null) {
        current = current.next;
      }
      current.next = node;
    }
  }

  add(p) {
    let result = new Polynomial();
    let p1 = this.head;
    let p2 = p.head;
    while (p1 !== null && p2 !== null) {
      if (p1.exp === p2.exp) {
        result.append(p1.coef + p2.coef, p1.exp);
        p1 = p1.next;
        p2 = p2.next;
      } else if (p1.exp > p2.exp) {
        result.append(p1.coef, p1.exp);
        p1 = p1.next;
      } else {
        result.append(p2.coef, p2.exp);
        p2 = p2.next;
      }
    }
    while (p1 !== null) {
      result.append(p1.coef, p1.exp);
      p1 = p1.next;
    }
    while (p2 !== null) {
      result.append(p2.coef, p2.exp);
      p2 = p2.next;
    }
    return result;
  }

  toString() {
    let current = this.head;
    let str = '';
    while (current !== null) {
      if (current.coef !== 0) {
        str += current.coef;
        if (current.exp !== 0) {
          str += 'x^' + current.exp;
        }
        if (current.next !== null && current.next.coef > 0) {
          str += '+';
        }
      }
      current = current.next;
    }
    return str;
  }
}

这个代码中,每个节点包含系数coef和指数exp,通过链表可以存储多个节点。append方法用来向多项式添加新的项,add方法用来将两个多项式相加,toString方法将多项式转化为字符串输出。

以上就是链表的各种操作详解,通过这些方法,可以方便地实现更多的数据结构和算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构之链表各种操作详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 用nodejs的实现原理和搭建服务器(动态)

    实现动态服务器一般需要掌握以下几个方面的知识: Node.js的基础语法和模块 Http模块的使用 路由功能的实现 模板引擎的使用 数据库的连接及操作 下面将采用一个简单的示例来讲解如何使用Node.js实现一个动态服务器。 搭建基础框架 首先在本地创建一个文件夹作为项目的根目录,并在该目录下创建一个主文件index.js。在index.js中导入http模…

    node js 2023年6月8日
    00
  • Node中的Events模块介绍及应用

    Node中的Events模块介绍及应用 1. 什么是Events模块 Events模块是Node中处理系统或应用程序中发生的事件的核心 Events模块大量应用于基于事件驱动的异步系统中,如网络编程、用户输入等场景 Events模块提供了一个事件触发与事件监听的能力,能够实现事件的发布/订阅、消息队列等开发 2. Events模块主要API on(event…

    node js 2023年6月8日
    00
  • Node.js使用WebAssembly

    下面是关于Node.js使用WebAssembly的文档攻略。 Node.js使用WebAssembly 什么是WebAssembly WebAssembly(简称WASM)是一种新型的编程语言,它可以在多种平台上运行,并且可以高效地执行循环密集、CPU密集型和低级别代码。WASM默认使用二进制格式,这使得它在网络传输或存储时可以大大减少体积。WASM在Ja…

    node js 2023年6月8日
    00
  • node.js中的http.response.writeHead方法使用说明

    下面是关于“node.js中的http.response.writeHead方法使用说明”的完整攻略。 简介 在Node.js中,我们可以使用http模块来创建一个Web服务器。当服务器收到客户端请求后,服务器需要向客户端发送HTTP响应,可以使用http.response.writeHead方法来设置响应的头部信息。 http.response.write…

    node js 2023年6月8日
    00
  • 详解vue+nodejs获取多个表数据的方法

    关于“详解vue+nodejs获取多个表数据的方法”的完整攻略,以下是详细步骤和示例说明。 步骤: 创建一个Vue项目: vue create project_name 安装axios和vue-resource: npm install axios vue-resource –save 在main.js中引入Vue和vue-resource: import…

    node js 2023年6月8日
    00
  • 分析node事件循环和消息队列

    分析Node事件循环和消息队列 什么是Node事件循环和消息队列 Node.js是一种基于事件驱动和异步I/O模型的JavaScript运行时环境。在Node.js中,事件循环和消息队列是实现异步事件处理的重要组成部分。 事件循环是 Node.js 的核心,它负责在主线程中不断地轮询队列,查看是否有新的事件需要处理。 消息队列是用来存放事件回调函数的队列,当…

    node js 2023年6月8日
    00
  • Ajax获取node服务器数据的完整步骤

    Ajax是一种在Web应用程序中使用的常用技术,可实现无需重新加载整个页面即可更新部分页面内容。本篇攻略将详细介绍如何使用Ajax从Node服务器中获取数据的完整步骤。 步骤一:创建Node服务器 首先需要创建一个Node服务器,提供数据的访问接口。可以使用Express框架来快速搭建这个服务器。下面是一个简单的示例代码: const express = r…

    node js 2023年6月8日
    00
  • express框架+bootstrap美化ejs模板实例分析

    下面我将为你详细讲解“express框架+bootstrap美化ejs模板实例分析”的完整攻略。 一、概述 Express框架是Node.js项目开发的常用框架之一,它提供了一个简单、灵活的Web应用程序开发框架,可以帮助你快速搭建自己的Web应用。Bootstrap是一套优秀的前端框架,它包括了HTML、CSS以及JavaScript工具,可以非常方便地用…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部