首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

单链表JavaScript上的简单递归迭代

单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在JavaScript中,可以使用对象来表示单链表。

简单递归是一种通过函数自身调用来解决问题的方法。在单链表中,可以使用递归来实现一些操作,例如遍历、查找、插入和删除等。

迭代是一种通过循环来解决问题的方法。在单链表中,可以使用迭代来实现一些操作,例如遍历、查找、插入和删除等。

下面是单链表JavaScript上的简单递归和迭代的实现示例:

  1. 遍历单链表(递归):
代码语言:txt
复制
function traverseRecursive(node) {
  if (node !== null) {
    console.log(node.data); // 打印节点数据
    traverseRecursive(node.next); // 递归遍历下一个节点
  }
}
  1. 遍历单链表(迭代):
代码语言:txt
复制
function traverseIterative(head) {
  let current = head;
  while (current !== null) {
    console.log(current.data); // 打印节点数据
    current = current.next; // 移动到下一个节点
  }
}
  1. 查找节点(递归):
代码语言:txt
复制
function searchRecursive(node, target) {
  if (node === null) {
    return null; // 未找到目标节点
  }
  if (node.data === target) {
    return node; // 找到目标节点
  }
  return searchRecursive(node.next, target); // 递归查找下一个节点
}
  1. 查找节点(迭代):
代码语言:txt
复制
function searchIterative(head, target) {
  let current = head;
  while (current !== null) {
    if (current.data === target) {
      return current; // 找到目标节点
    }
    current = current.next; // 移动到下一个节点
  }
  return null; // 未找到目标节点
}
  1. 插入节点(递归):
代码语言:txt
复制
function insertRecursive(node, newData) {
  if (node.next === null) {
    node.next = { data: newData, next: null }; // 在末尾插入新节点
  } else {
    insertRecursive(node.next, newData); // 递归插入下一个节点
  }
}
  1. 插入节点(迭代):
代码语言:txt
复制
function insertIterative(head, newData) {
  let current = head;
  while (current.next !== null) {
    current = current.next; // 移动到末尾节点
  }
  current.next = { data: newData, next: null }; // 在末尾插入新节点
}
  1. 删除节点(递归):
代码语言:txt
复制
function deleteRecursive(node, target) {
  if (node === null) {
    return null; // 未找到目标节点
  }
  if (node.data === target) {
    return node.next; // 删除目标节点
  }
  node.next = deleteRecursive(node.next, target); // 递归删除下一个节点
  return node;
}
  1. 删除节点(迭代):
代码语言:txt
复制
function deleteIterative(head, target) {
  if (head === null) {
    return null; // 空链表
  }
  if (head.data === target) {
    return head.next; // 删除头节点
  }
  let current = head;
  while (current.next !== null) {
    if (current.next.data === target) {
      current.next = current.next.next; // 删除目标节点
      return head;
    }
    current = current.next; // 移动到下一个节点
  }
  return head;
}

以上是单链表JavaScript上的简单递归和迭代的实现示例。在实际开发中,可以根据具体需求选择递归或迭代的方式来操作单链表。腾讯云提供了云计算相关的产品,例如云服务器、云数据库、云存储等,可以根据实际需求选择相应的产品进行开发和部署。具体产品介绍和链接地址可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • java中Iterable接口使用,实现一个链表迭代

    链表实现: public class MyLinkedList { private static class Entry{ private E value;...iterator()返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中对象。...此外,迭代器更是设计模式,如对图遍历可以实现一个图迭代器,简化代码,将遍历思想抽象出来。 自己实现一个可以遍历上述链表迭代器,这个迭代器需要实现Iterator接口中方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合中的当前迭代器指向对象元素 public class MyLinkedList ...show()方法功能是相同,但是迭代器为遍历集合对象元素提供了一种统一方法,此外也可以使用迭代器做更多事情。

    57610

    备战蓝桥杯————递归反转链表一部分

    递归反转链表已经明白了,递归反转链表一部分你知道怎么做吗?...一、反转链表Ⅱ 题目描述         给你链表头指针 head 和两个整数 left 和 right ,其中 left <= right 。...请你反转从位置 left 到位置 right 链表节点,返回 反转后链表 。...解题思路及代码  reverseN 递归反转链表算法,具体思路如下:         函数 reverseN 用于反转以 head 为起点前 n 个节点,并返回反转后新头结点。         ...将 head next 指针指向记录后驱节点 successor,保证反转后链表与后面的节点连接起来。         返回新头结点 last,作为一层递归结果。

    12110

    简单JavaScript事件委托(

    https://blog.csdn.net/FE_dev/article/details/78821578 说明 这篇文章说JavaScript事件委托,这次先说一些比较基本知识。...事件:JavaScript 侦测到行为就是事件,比如鼠标点击、某个键盘键被按下、元素获得焦点。 委托:就是把原来自己做事,交给别人做。...,并不在生成元素绑定事件,而是在生成元素父元素绑定事件,因为父元素是一直存在,所以绑定事件就可以生效。...总结 这篇文章是比较基础,还有一些东西没有说,比如文中说 事件委托实现 时候,举例子比较简单,监听 li 里面没有子元素,如果存在子元素时,那点击子元素 事件就不会触发,那怎么办呢?...还有 JQuery中事件委托 又是怎么做呢? 看这里 简单JavaScript事件委托(下)

    58520

    反转链表

    题目描述 反转一个链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代递归地反转链表。你能否用两种方法解决这道题?...prev; prev = cur; cur = next; } return prev; } }; 拓展 通过链表定义可以得知...,链表也是递归结构,因此,也可以使用递归方式来进行reverse操作。...由于链表是线性,使用递归方式将导致栈使用也是线性,当链表长度达到一定程度时,递归会导致爆栈,因此,现实中并不推荐使用递归方式来操作链表。...描述 除第一个节点外,递归链表reverse 将第一个节点添加到已reverse链表之后 这里需要注意是,每次需要保存已经reverse链表头节点和尾节点 C++实现 // 普通递归 class

    52420

    递归反转链表一部分

    转载自labuladong算法小抄,go语言描述 反转链表迭代实现不是一个困难事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转链表一部分,你是否能够递归实现呢?...如果你还不会递归地反转链表也没关系,本文会从递归反转整个链表开始拓展,只要你明白链表结构,相信你能够有所收获。...但是我们递归解法不用一个 for 循环,纯递归实现反转。 迭代实现思路看起来虽然简单,但是细节问题很多,反而不容易写对。相反,递归实现就很简洁优美,下面就由浅入深,先从反转整个链表说起。...2、当链表递归反转之后,新头结点是 last,而之前 head 变成了最后一个节点,别忘了链表末尾要指向 null: head.next = nil 理解了这两点后,我们就可以进一步深入了,接下来问题其实都是在这个算法扩展...处理看起来比较困难问题,可以尝试化整为零,把一些简单解法进行修改,解决困难问题。 值得一提是,递归操作链表并不高效。

    87220

    链表+6道前端算法面试高频题解

    可见链表对内存要求降低了,但是随机访问性能就没有数组好了,需要 O(n) 时间复杂度。 下图中展示了链表链表添加和删除操作,其实链表操作本质就是处理链表结点之间指针。...链表结点结构由数据域和指针域组成,在 JavaScript 中,以嵌套对象形式实现。...,是我们遍历链表起点 尾结点:尾结点指针不是指向下一个结点,而是指向一个空地址 NULL 链表链表是单向,它结点只有一个后继指针 next 指向后面的结点,尾结点指针指向空地址 循环链表:...回到本题递归解法: 写递归解法的话,老套路,先明确终止条件,链表中没有节点或只有一个节点时无法进行交换。 接下来递归进行两两交换节点并更新指针关系。 返回新链表头节点 newHead。...开始迭代,记录 next 指针留备后用,反转指针。 推进指针继续迭代,最后返回新链表头节点 prev。

    32930

    链表逆序

    2、 链表逆序 第二个题目是很经典链表逆序”问题。...如何在不使用额外存储节点情况下使一个链表所有节点逆序?我们先用迭代循环思想来分析这个问题,链表初始状态如图(1)所示: ?...图(4)经过第三次迭代状态 此时可以看出,在图(4)基础再进行一次迭代就可以完成链表逆序,因此循环迭代终止条件就是当前head指针是NULL。...= next; 循环终止条件是: head == NULL 根据以上分析结果,逆序链表循环算法如下所示: 61 LINK_NODE *ReverseLink(LINK_NODE *head)...()对问题进行求解,将链表分为当前表头节点和其余节点,递归思想就是,先将当前表头节点从链表中拆出来,然后对剩余节点进行逆序,最后将当前表头节点连接到新链表尾部。

    74130

    终于上线了,速来!

    除了数据结构操作可视化,还支持用 @visualize 标签 对递归算法进行可视化,大幅降低读者理解递归算法难度。 下面就简单介绍一下可视化面板编辑器使用方法。...操作内置数据结构 类似数组、哈希表等 JavaScript 内置数据结构,就正常初始化和操作它们即可,比如: 需要着重讲的是 力扣/LeetCode 中一些特殊数据结构,比如链表ListNode和二叉树...操作链表 首先说一下链表,你可以用ListNode.create方法快速创建一条链表,这是一个简单例子: /** * Definition for singly-linked list....fib函数开启递归树可视化功能,每次递归调用会被可视化为递归树上一个节点,函数参数中n值会显示在节点。...2、@visualize注释必须写在函数定义一行,否则无法追踪递归过程。

    17110

    两种方法求解链表高频面试题之链表反转

    链表反转 链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问链表反转。 今天我们就一起来看下。...题目链接:https://leetcode-cn.com/problems/reverse-linked-list/ 点击文末阅读原文也可到达。 题目描述: 反转一个链表。...示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路 这道题是非常经典一道题了,没有很多套路,主要方法有迭代法和递归法两种方法实现。...个人感觉做链表题目,最重要还是自己多写,多练。 方法一:迭代迭代法就是相当于假设有两个链表,其中一个链表是空,我们要做工作就是把当前链表元素不断移动到空链表。...head.next.next = head; head.next = null; return node; } } 复杂度分析 时间复杂度: 空间复杂度: 总结 递归时间复杂度比迭代空间复杂度要高

    32610

    【算法】213-每周一练 之 数据结构与算法(LinkedList)

    所以,链表允许插入和删除表上任意位置节点,但是不允许随即存取。链表有很多种不同类型:单向链表、双向链表及循环链表。...链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。 链表插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难。...toString():由于列表项使用 Node 类,需要重写继承自 JavaScript 对象默认 toString() 方法,让其只输出元素值。...用链表方式,输出一个反转后链表。...解题思路2.使用递归: 这里也可以使用递归,也可以参考反转链表问题,终止条件是递归链表为空,或者只剩下一个元素没得交换了,才终止。 ---- 解析: 题目出自:[Leetcode 24.

    62530

    「算法与数据结构」JavaScript链表

    写在前面 此文会先探讨下什么是链表以及在 JavaScript链表,接着我们会使用 JavaScript 这门语言动手实现下各类链表设计,最后我们会抛出一些常规疑问,并从各个方面一一解答,总之...,必须要从起点(链表头部节点)开始迭代链表直到找到所需元素,这点需要注意 JavaScript链表 上面我们简单介绍了常规链表概念,但是在 JavaScript 这门语言中,我们怎么表示链表呢?...指针指向新添加元素即可 新添加元素 next 指针默认为 null,链表最后一个元素 next 值也就为 null,另外,将节点挂到链表之后,还需将链表长度加 1,保证 length 属性等于链表长度...,这个比较简单,直接迭代即可,匹配到了返回对应索引,匹配不到返回 -1 // 获取链表中给定元素索引 LinkedList.prototype.indexOf = function (val) {...这个方法在更新时候是进行递归操作,如果在更新过程中有大量节点需要更新,就会出现长时间占用 JS 主线程情况,并且整个递归过程是无法被打断,由于 JS 线程和 GUI 线程是互斥(详看「硬核

    88010

    Js算法与数据结构拾萃(3):链表

    Js算法与数据结构拾萃(3):链表 补白 准备阅读: 《javascript数据结构和算法》读书笔记:链表 这仍然是笔者一年前笔记。...题解2:链表迭代链表思路,很容易想到做迭代: var removeElements = function(head, val) { let current=head;...你可以迭代递归地反转链表。你能否用两种方法解决这道题?...题解2:递归 递归思路是甩锅,解决不了推给下一代(“搁置争议,交给下一代智慧去解决”)。 每代智慧是什么呢? •遇到尾部next为null,递归终止•遇到头部,让它next为空。...我们仍然以龟兔赛跑为例子:假设兔子在环追上乌龟地点是first。那么,乌龟走距离为F+a。

    61920

    反转链表

    难度:简单 来源:206. 反转链表 反转一个链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代递归地反转链表。...思路: 定义输出链表 prev; 在遍历链表时,将当前节点 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。...最后返回新头引用; 顺序遍历链表 head , 将其中元素移入链表 prev ; 图解如下; 而递归思路其实就是传递 2 个参数,prev 和 curr ,分别用来指定反转后和前链表,思路是差不多...题解一:迭代 /** * Definition for singly-linked list....* * @param {ListNode} head * @return {ListNode} */ var reverseList = function(head) { // 方法一:迭代实现

    83220
    领券