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

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

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

相关文章

  • 十三、WIN2000下的xcopy可以复制文件的安全设置

    在WIN2000系统下,xcopy命令是一个强大的工具,可以用于文件和文件夹的复制,同时还支持文件的安全设置。下面是在WIN2000下使用xcopy复制文件的安全设置的攻略。 1. xcopy命令的基础用法 xcopy命令是Windows操作系统中自带的一个文件复制命令。它可以复制文件夹本身和它们的内容,同时还可以复制子目录中的内容。它的基本语法是: xco…

    other 2023年6月28日
    00
  • 微信小程序 教程之引用

    微信小程序教程之引用攻略 1. 引用的概念 在微信小程序中,引用是指在一个小程序中使用另一个小程序的功能或页面。通过引用,我们可以实现代码的复用,提高开发效率。 2. 引用的使用方法 2.1 引用小程序的页面 要引用另一个小程序的页面,需要在当前小程序的app.json文件中配置引用的小程序的usingComponents字段。示例如下: { \"…

    other 2023年8月20日
    00
  • Java中final与继承操作实例分析

    Java中final与继承操作实例分析 简介 在Java中,final是一个关键字,它可以作为修饰符用于类、方法和变量。final修饰的变量表示常量,一旦被赋值就无法更改;final修饰的方法表示该方法无法被子类覆盖或重写;final修饰的类表示该类无法被继承。 本文的主要内容是介绍Java中final与继承的相关操作,通过示例说明,展示final和继承的特…

    other 2023年6月26日
    00
  • Python2和Python3的共存和切换使用

    Python2和Python3是两个不兼容的版本,但很多开发者仍然需要同时使用它们,所以让Python2和Python3共存和切换使用就显得尤为重要。下面是Python2和Python3的共存和切换使用的详细攻略。 安装Python2和Python3 首先,我们需要在电脑上安装Python2和Python3。可以从官方网站https://www.python…

    other 2023年6月27日
    00
  • React生命周期与父子组件间通信知识点详细讲解

    React生命周期与父子组件间通信是React开发中非常重要的知识点。在React中,组件的生命周期由一系列函数构成,这些函数在组件的不同阶段被调用。同时,React也提供了多种方法,允许父组件与子组件之间进行通信。本文将从以下几个方面进行详细讲解: React组件生命周期 React组件生命周期由一系列特定的函数构成,这些函数会在组件被实例化、更新和卸载等…

    other 2023年6月27日
    00
  • CentOS EXT4文件系统的详解

    下面是关于“CentOS EXT4文件系统的详解”的完整攻略: CentOS EXT4文件系统的详解 介绍 EXT4是一种常见的Linux文件系统,是EXT3文件系统的升级版。它是一种可靠的、高性能的文件系统,可用于管理大型文件、大容量磁盘和高并发访问。在CentOS中,默认的文件系统就是EXT4。 文件系统结构 EXT4文件系统将磁盘划分为不同的区域,每个…

    other 2023年6月27日
    00
  • softlockup解决思路

    以下是关于“softlockup解决思路”的完整攻略,包含两个示例。 softlockup解决思路 softlockup是Linux内核中的一种死锁情况,通常是由内核线程长时间占用CPU资源而导致的。以下是关于如何解决softlockup的详细攻略。 1. 升级内核 softlockup通常是由于内核中的某些bug导致的。因此,升级内核是解决softlock…

    other 2023年5月9日
    00
  • 实验十一 团队作业7—团队项目设计完善&编码测试

    实验十一 团队作业7—团队项目设计完善&编码测试 本篇文章旨在介绍实验十一团队作业7的团队项目设计完善和编码测试过程。在团队合作中,团队成员需要协调合作,互相配合,做好项目设计细节和编码测试工作,这样才能保证项目的顺利推进和高质量的交付。 项目设计完善 在项目设计完善阶段,团队成员需要对前期的项目设计进行细化和完善。具体的完善内容包括但不限于: …

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