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

yizhihongxing

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

单链表和循环链表是数据结构中非常基础的两种链式结构,它们可以用JavaScript来实现。本文将详细讲解单链表和循环链表的实现过程和常见操作,且包含两条示例说明。

单链表

单链表是一种链式结构,每个节点包含数据和指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。

实现单链表

在JavaScript中,我们可以使用对象来实现单链表。每个节点可以用一个对象来表示,该对象中包含数据和指向下一个节点的指针。

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

function LinkedList() {
  this.head = new Node("head");
  this.find = find;
  this.insert = insert;
  this.remove = remove;
  this.display = display;
}

function find(item) {
  var currNode = this.head;
  while (currNode.element != item) {
    currNode = currNode.next;
  }
  return currNode;
}

function insert(newElement, item) {
  var newNode = new Node(newElement);
  var current = this.find(item);
  newNode.next = current.next;
  current.next = newNode;
}

function remove(item) {
  var prevNode = this.head;
  while (prevNode.next != null && prevNode.next.element != item) {
    prevNode = prevNode.next;
  }
  if (prevNode.next != null) {
    prevNode.next = prevNode.next.next;
  }
}

function display() {
  var currNode = this.head;
  while (currNode.next != null) {
    console.log(currNode.next.element);
    currNode = currNode.next;
  }
}

上面的代码中,我们定义了两个构造函数:Node和LinkedList。Node对象表示链表中的节点,LinkedList对象表示整个链表。

在LinkedList的构造函数中,我们首先定义了一个头节点head,它的element值为字符串"head",next为null,表示它是链表的开头。然后我们定义了一些常用的方法,例如find、insert、remove和display。这些方法可以用来在链表中查找、插入、删除和显示节点。其中,find方法和remove方法使用了while循环,该循环会一直遍历链表,直到遍历到指定的节点。

单链表示例

下面是一个将单链表用于队列的示例。在JavaScript中,单链表可以用来实现队列,只需要在链表尾部添加元素(入队),在链表头部删除元素(出队)即可。

function Queue() {
  this.dataStore = new LinkedList();
  this.enqueue = enqueue;
  this.dequeue = dequeue;
  this.front = front;
  this.back = back;
  this.toString = toString;
  this.empty = empty;
}

function enqueue(element) {
  this.dataStore.insert(element, "head");
}

function dequeue() {
  this.dataStore.remove(this.front());
}

function front() {
  var firstNode = this.dataStore.head.next;
  if (firstNode == null) {
    return null;
  }
  return firstNode.element;
}

function back() {
  var lastNode = this.dataStore.head;
  while (lastNode.next != null) {
    lastNode = lastNode.next;
  }
  if (lastNode == this.dataStore.head) {
    return null;
  }
  return lastNode.element;
}

function toString() {
  var result = "";
  var currNode = this.dataStore.head;
  while (currNode.next != null) {
    result += currNode.next.element + "\n";
    currNode = currNode.next;
  }
  return result;
}

function empty() {
  return this.dataStore.head.next == null;
}

在上面的代码中,我们定义了Queue对象来表示队列。我们将Queue对象的dataStore属性设置为一个LinkedList对象,这样就可以使用LinkedList的方法对队列进行操作。其中,enqueue方法用于在链表尾部添加元素,而dequeue方法用于在链表头部删除元素。front和back方法用于获取队列的首部和尾部元素。

循环链表

循环链表是一种链式结构,它的最后一个节点的指针指向链表的第一个节点,形成一个循环。

实现循环链表

在JavaScript中,我们可以使用两种方式来实现循环链表:

  • 基于LinkedList对象,在LinkedList的构造函数中将最后一个节点的next指向head。
  • 将最后一个节点的next指针设置为head。

本文中我们选用第一种方式,下面是实现代码:

function CircularLinkedList() {
  this.head = new Node("head");
  this.head.next = this.head;
  this.find = find;
  this.insert = insert;
  this.remove = remove;
  this.display = display;
}

// 和单链表相同的代码
function find(item) {...}

function insert(newElement, item) {...}

function remove(item) {...}

function display() {...}

上面的代码和单链表的实现非常相似,唯一的不同是在CircularLinkedList的构造函数中,我们将最后一个节点的next属性设置为head,表示这是一个循环链表。

循环链表示例

下面是一个使用循环链表来实现约瑟夫环的示例:

function Josephus(n, m) {
  var L = new CircularLinkedList();
  var currNode = L.head;
  for (var i = 1; i <= n; i++) {
    currNode.next = new Node(i);
    currNode = currNode.next;
  }
  currNode.next = L.head.next; // 将最后一个节点的next指向第一个节点,形成循环链表
  currNode = L.head.next;

  while (currNode.next != currNode) {
    // 数m个数,然后删除当前元素
    for (var i = 1; i < m; i++) {
      currNode = currNode.next;
    }
    L.remove(currNode.element);
    currNode = currNode.next;
  }
  return currNode.element; // 最后一个元素即为胜利者
}

在上面的代码中,我们定义了Josephus函数来实现约瑟夫环。我们首先创建一个循环链表L,然后依次插入1~n个元素。最后将最后一个元素的next指向第一个元素,形成循环链表。

接着,我们使用一个while循环,数m个数,然后删除当前元素,直到链表中只剩下一个元素。最后返回最后一个元素的值,即为胜利者的编号。

总结

单链表和循环链表是JavaScript中常用的链式结构,能够实现队列、约瑟夫环等应用。在实现链表时,我们需要注意链表头和尾的处理,这是链表操作的重要部分。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构之单链表和循环链表 - Python技术站

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

相关文章

  • node将对象转化为query的实现方法

    将对象转化为query是在前端或后台请求时常见的操作,Node.js提供了将对象转化为query的实现方式。下面是完整攻略: 使用querystring模块 querystring模块提供了将对象转化为query的方法stringify()和将query转化为对象的方法parse()。 将对象转化为query: const querystring = req…

    node js 2023年6月8日
    00
  • nodejs动态创建二维码的方法

    当我们需要生成二维码时,可能会选择使用前端插件,比如jquery-qrcode等。但是,如果我们想要在后端生成二维码,这时候就需要使用Node.js来实现了。 下面是关于“nodejs动态创建二维码的方法”的完整攻略: 安装QRCode模块 在Node.js中,我们可以使用QRCode模块来生成二维码。在安装QRCode之前,需要先确保 Node.js 环境…

    node js 2023年6月8日
    00
  • 浅谈js之字面量、对象字面量的访问、关键字in的用法

    JS之字面量 在JavaScript中,字面量是指在代码中硬编码出现的固定值,例如字符串、数字、布尔值等。字面量在JS中非常常见且易于使用,下面是一些常见的字面量类型: 数值字面量 使用数值字面量可以直接创建数字类型,可以是整数或浮点数: let num1 = 10; // 整数 let num2 = 3.14; // 浮点数 字符串字面量 使用字符串字面量…

    node js 2023年6月8日
    00
  • 手机Web APP如何实现分享多平台功能

    分享是手机Web APP中常见的功能之一,让用户可以将自己喜欢的内容快速分享到自己的社交媒体账号上,从而实现增加用户粘性、提升用户体验的效果。实现多平台分享,可以让用户同时分享到不同的社交媒体平台,扩大传播范围,提高品牌曝光率。下面是实现手机Web APP多平台分享功能的完整攻略。 1. 获取分享渠道的授权 在实现多平台分享之前,需要先获取对应社交媒体平台的…

    node js 2023年6月8日
    00
  • 详解Nodejs基于mongoose模块的增删改查的操作

    当我们使用 Node.js 构建应用程序时,我们通常需要连接数据库操作数据。Mongoose 是一个在 Node.js 中操作 MongoDB 数据库的 ODM(对象文档映射器)模块,它使得我们可以更加方便地进行数据存储与操作。 本文将详细讲解如何使用 Mongoose 模块进行增删改查的操作,主要包括以下内容: 连接 MongoDB 数据库 定义模型(Sc…

    node js 2023年6月8日
    00
  • node+socket实现简易聊天室功能

    下面是使用node+socket实现简易聊天室功能的完整攻略: 一、安装Node.js Node.js是一个JavaScript运行时环境,可以使用JavaScript进行服务器端编程。我们需要在本地先安装Node.js才能进行后续操作。 二、安装Socket.io Socket.io是一个实现实时双向通信的JavaScript库。我们可以使用Socket.…

    node js 2023年6月8日
    00
  • Node.js开发指南中的简单实例(mysql版)

    以下是 “Node.js开发指南中的简单实例(mysql版)” 的完整攻略: 需求分析 首先,我们需要分析这个简单实例的需求,该实例需要实现一个简单的博客系统。博客系统需要能够实现用户的注册、登录、退出等基本功能。用户登录成功后,可以查看、创建、修改、删除自己的博客文章。 技术架构 下面,我们来简要介绍一下这个博客系统的技术架构: 前端:使用 Bootstr…

    node js 2023年6月8日
    00
  • Node.js进程退出的深入理解

    Node.js进程退出的深入理解 Node.js进程退出是一个非常重要的问题,在应用程序开发中经常会遇到各种问题,例如应用程序崩溃、进程无法退出等等,所以我们需要深入理解Node.js进程退出的原理及技巧,以避免这些问题的发生。 Node.js进程退出的原理 在Node.js中,进程的退出分为两种情况: 程序正常退出 程序异常退出 在程序正常退出的情况下,可…

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