js链表操作(实例讲解)

js链表操作(实例讲解)

什么是链表

链表是一种基础数据结构,它由许多节点(Node)组成,每个节点都包含一个数据部分和一个指向下一个节点的指针。

链表可以看做是由多个节点组成的数据结构,每个节点包含元素值和指向下一个节点的指针属性。并且,链表可以表示各种抽象数据类型。链表中的第一个节点称为头节点。如果链表为空,则头节点为null。最后一个节点称为尾节点。尾节点的 next 属性为 null 。

相比较数组,链表的特殊之处在于它不需要在内存中占用连续的空间,这使得链表更加灵活,更适用于插入和删除操作。

链表的创建

链表可以从头节点开始创建,头节点是链表的起点。我们可以用一个对象来表示一个节点,其结构可以是这样的:

var ListNode = function(val) {
    this.val = val;
    this.next = null;
};

链表的遍历

链表遍历是指访问链表中的每个节点,可以用 while 循环实现链表的遍历。遍历链表中的每个节点时,可以对节点进行操作,或者获取节点的值。

var cur = head;
while(cur !== null) {
    console.log(cur.val);
    cur = cur.next;
}

链表的插入

链表的插入分为在首部插入、在中部插入和在尾部插入。在中部插入需要先找到要插入位置的节点,即前驱节点。其插入过程,可以分三步来实现:

  • 在内存中创建一个新节点。
  • 将新节点的 next 指针指向插入位置的节点。
  • 将插入位置的前驱节点的下一节点 next 指针指向新节点。
var newNode = new ListNode(val);
if(position === 0) {
    newNode.next = head;
    return newNode;
} 

var cur = head;
var pre = null;
var index = 0;

while(index < position) {
    pre = cur;
    cur = cur.next;
    index++;
}

pre.next = newNode;
newNode.next = cur;

return head;

链表的删除

链表的删除分为三种情况:在首部删除、在中部删除和在尾部删除。在中部和尾部删除,需要找到要删除的节点的前驱节点。其删除过程,可以分三步来实现:

  • 找到要删除节点的前驱节点。
  • 将前驱节点的 next 指针指向要删除节点的下一个节点。
  • 删除要删除的节点。
if (position === 0) {
  return head.next;
}

var cur = head;
var pre = null;
var index = 0;

while (index < position) {
  pre = cur;
  cur = cur.next;
  index++;
}

pre.next = cur.next;

return head;

链表的反转

链表的反转可以从头节点开始遍历每个节点,并将其插入到一个新的链表中。

var reverseList = function(head) {
  var newHead = null;

  while (head !== null) {
    var next = head.next;
    head.next = newHead;
    newHead = head;
    head = next;
  }

  return newHead;
};

链表的示例说明

示例一

在以下的链表中插入一个值为 4 的节点,插入的位置为 2:

1 -> 2 -> 3

插入后的结果为:

1 -> 2 -> 4 -> 3

实现代码:

var head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);

function insert(head, val, position) {
  var newNode = new ListNode(val);
  if(position === 0) {
    newNode.next = head;
    return newNode;
  } 

  var cur = head;
  var pre = null;
  var index = 0;

  while(index < position) {
    pre = cur;
    cur = cur.next;
    index++;
  }

  pre.next = newNode;
  newNode.next = cur;

  return head;
}

head = insert(head, 4, 2);
// head: 1 -> 2 -> 4 -> 3

示例二

在以下的链表中删除一个值为 2 的节点:

1 -> 2 -> 3

删除后的结果为:

1 -> 3

实现代码:

var head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);

function deleteNode(head, val) {
  if (head === null) {
    return head;
  }

  if (head.val === val) {
    return head.next;
  }

  var cur = head;
  var pre = null;

  while (cur !== null) {
    if (cur.val === val) {
      pre.next = cur.next;
    } else {
      pre = cur;
      cur = cur.next;
    }
  }

  return head;
}

head = deleteNode(head, 2);
// head: 1 -> 3
阅读剩余 76%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js链表操作(实例讲解) - Python技术站

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

相关文章

  • Kotlin伴随对象的初始化方法示例讲解

    请看下面的攻略。 Kotlin伴随对象的初始化方法示例讲解 在Kotlin中,伴随对象是一种特殊类型的对象,它是某个类的单例对象。本文将对Kotlin伴随对象的初始化方法进行详细讲解,并给出两条示例说明。 1. 伴随对象的初始化方法 Kotlin中为伴随对象提供了多种初始化方法,主要有以下两种: init方法:该方法与普通类的init方法类似,用于在伴随对象…

    other 2023年6月20日
    00
  • 自己动手写的javascript前端等待控件

    关于自己动手写的JavaScript前端等待控件,我将分几个方面进行讲解。 目的 在前端页面中,我们常常需要等待某个操作的完成,例如等待页面加载等待、等待AJAX数据、等待输入等操作,此时需要显示一个等待状态或者进度条等,来提示用户当前操作正在进行中。自己动手写一个前端等待控件,可以提高用户体验,让用户了解当前操作的状态。 基本思路 一个前端等待控件的基本思…

    other 2023年6月27日
    00
  • 详解C语言中的函数、数组与指针

    详解C语言中的函数、数组与指针 介绍 C语言作为一种高效、灵活的编程语言,拥有强大的函数、数组和指针等特性。这些特性在C语言中非常重要,更是需要深入理解的技能点,因此本篇文章将会为大家详细讲解这些特性的用法和注意事项。 函数 函数是C语言中最基础的概念之一,它的作用是将程序分为若干个可重用的部分,提高代码的复用性和可维护性。一个函数一般包括函数名、返回类型、…

    other 2023年6月25日
    00
  • 邮件的协议及服务器工作原理

    邮件协议 邮件协议是指在计算机网络中进行邮件传输和接收的一套规范。常用的邮件协议有 POP3、IMAP 和 SMTP 等。 POP3(Post Office Protocol Version 3)是一种用于接收邮件的协议。该协议通过 TCP/IP 连接到邮件服务器的 110 端口,并获取邮件。 IMAP(Internet Mail Access Protoc…

    other 2023年6月27日
    00
  • 一文详解如何用原型链的方式实现JS继承

    下面就来详细讲解一下如何用原型链的方式实现JS继承。 1. 什么是原型链 在JavaScript中,万物皆对象,每个对象都有 __proto__ 属性,指向了它的原型对象。原型对象也是一个对象,也有 __proto__ 属性,指向了它的原型对象。这样的对象构成了一个链状结构,被称为原型链。 2. 如何用原型链实现JS继承 原理很简单,就是在子类的原型对象上添…

    other 2023年6月27日
    00
  • JavaScript axios安装与封装案例详解

    JavaScript axios安装与封装案例详解 简介 在 Web 开发过程中,我们经常需要进行异步网络请求。这时候,一个强大并且易于使用的工具就是 axios 库。axios 是一个基于 promise 的 HTTP 客户端,可以用于浏览器和 Node.js 中。 在本文中,我们将详细讲解如何安装 axios 库,并介绍如何封装 axios 进行网络请求…

    other 2023年6月25日
    00
  • leveldb源码–总体架构分析

    LevelDB源码–总体架构分析 LevelDB是一个高性能的键值存储库,由Google开发。本文将对LevelDB的总体架构进行分析,包括存储引擎内存管理、文件管理、并发控制等方面。 存储引擎 LevelDB的存储引擎用了LSM-Tree(-Structured Merge Tree)的数据结构。LSM-Tree是一种基于磁盘的数据结构,它将数据分多个层…

    other 2023年5月9日
    00
  • win7_32下编译FFmpeg

    Win7 32位系统下编译FFmpeg FFmpeg是一个非常强大的音视频处理工具,而编译FFmpeg可以让我们更好地深入学习它。本篇文章将介绍在Win7 32位系统下编译FFmpeg的详细步骤。 步骤一:搭建编译环境 下载MinGW-w64,建议下载mingw-w64-install.exe。 安装MinGW-w64,并选择32位架构以及安装路径。 打开c…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部