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日

相关文章

  • c++-如何解决wsaewouldblock错误

    在C++中,当使用套接字进行网络编程时,可能会遇到WSAEWOULDBLOCK错误。这个错误通常表示套接字正在等待数据,但没有数据可用。本文将提供一些关于如何解决WSAEWOULDBLOCK错误的详细说明,包括如何使用非阻塞套接字、如何使用select函数等。 使用非阻塞套接字 非阻塞套接字是一种特殊类型的套接,它允许程序在等待数据时继续执行其他任务。当使用…

    other 2023年5月9日
    00
  • r语言sample函数

    当然,我很乐意为您提供有关“R语言sample函数”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是sample函数? sample函数是R语言中的一个随机抽样函数,可以用于从一个向量或数据框中随机抽取指定数量的元素。 2. sample函数的语法 sample函数的语法如下: sample(x, size, replace = FALSE, prob…

    other 2023年5月6日
    00
  • Android使用VideoView播放本地视频和网络视频的方法

    Android使用VideoView播放本地视频和网络视频的方法 在Android开发中,可以使用VideoView来播放本地视频和网络视频。下面是详细的攻略,包含两个示例说明。 播放本地视频 要播放本地视频,需要将视频文件放置在Android设备的存储中,并使用VideoView来加载和播放视频。 将视频文件放置在res/raw目录下,或者将视频文件复制到…

    other 2023年8月21日
    00
  • 深入理解springboot中配置文件application.properties

    下面我将详细讲解“深入理解springboot中配置文件application.properties”的完整攻略: 什么是application.properties application.properties 是 Spring Boot 应用程序中的默认配置文件。它支持基于属性键值对的配置方式。在 application.properties 文件中,可…

    other 2023年6月25日
    00
  • Linux系统交换空间介绍

    Linux系统交换空间介绍 什么是交换空间? 交换空间(Swap Space)是Linux系统中的一部分磁盘空间,用于存储内存中暂时不活跃的进程或页面。当系统的物理内存不足时,操作系统会将一些不常用的内存页面转移到交换空间中,以释放物理内存供其他进程使用。 为什么需要交换空间? 交换空间的存在有以下几个原因: 扩展可用内存:交换空间可以扩展系统的可用内存。当…

    other 2023年8月2日
    00
  • windows XP使用的一些小技巧集锦

    Windows XP使用的一些小技巧集锦 Windows XP是一款经典的操作系统,因其稳定性和易用性而受到广泛关注。这里将介绍一些 Windows XP 的小技巧,以帮助您更好地使用它。 1. 启动时显示欢迎画面 Windows XP的启动画面可以让人感觉到很舒适,但在长时间等待时也会让人感到无聊。这里提供一种让 Windows XP 在启动时显示欢迎画面…

    other 2023年6月27日
    00
  • python画曲线图-如何使用python画曲线图

    Python是一种功能强大的编程语言,可以用于绘制各种类型的图表,包括曲线图。以下是关于如何使用Python绘制曲线的详细攻略: 安装Matplotlib Matplotlib是Python中最流行的绘图库之一,它可以用于绘制各种类型图表,包括曲线图。要使用Matplotlib,需要先安装它。可以使用以下命令在Python中安装Matplotlib: pip…

    other 2023年5月8日
    00
  • @Transactional注解:多个事务嵌套时,独立事务处理方式

    @Transactional注解: 多个事务嵌套时,独立事务处理方式 在讲解@Transactional注解的多个事务嵌套时的独立事务处理方式之前,我们先来了解一下@Transactional注解的作用。@Transactional注解是Spring框架中用于声明事务的注解,它可以应用在方法或类级别上。当应用在方法上时,该方法将被包装在一个事务中,当应用在类…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部