输出一个单链表&&反向输出一个单链表(最后有原链接)

2023-11-12

 输出一个单链表

假设我们有一个单链表:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

编写一个可以逐个输出链表元素的函数 printList(list)

使用两种方式实现:循环和递归。

哪个更好:用递归还是不用递归的?

基于循环的解法:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printList(list) {
  let tmp = list;

  while (tmp) {
    alert(tmp.value);
    tmp = tmp.next;
  }

}

printList(list);

请注意,我们使用了一个临时变量 tmp 来遍历链表。从技术上讲,我们可以使用函数的入参 list 来代替:

function printList(list) {

  while(list) {
    alert(list.value);
    list = list.next;
  }

}

 ……但是这不够明智。未来我们可能想要扩展这个函数,使用这个链表做其他的事儿,如果我们修改了 list,那么我们就失去了这个能力。说到好的变量命名,list 在这里是链表本身。代表它的第一个元素。它应该保持原样,这是清晰可靠的。从另一个方面来说,tmp 是充当了完全遍历链表的角色,就像 for 循环中的 i 一样。

递归解法

printList(list) 的递归实现遵循一个简单的逻辑:为了输出链表,我们应该输出 list 的当前的元素,list.next 同理:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printList(list) {

  alert(list.value); // 输出当前元素

  if (list.next) {
    printList(list.next); // 链表中其余部分同理
  }

}

printList(list);

哪个更好呢?

从技术上讲,循环更有效。这两种解法的做了同样的事儿,但循环不会为嵌套函数调用消耗资源。

另一方面,递归解法更简洁,有时更容易理解。

反向输出一个单链表

使用两种解法:循环和递归。

解决方案

使用递归

递归逻辑在这稍微有点儿棘手。

我们需要先输出列表的其它元素,然后 输出当前的元素:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printReverseList(list) {

  if (list.next) {
    printReverseList(list.next);
  }

  alert(list.value);
}

printReverseList(list);

使用循环

循环解法也比直接输出稍微复杂了点儿。

在这而没有什么方法可以获取 list 中的最后一个值。我们也不能“从后向前”读取。

因此,我们可以做的就是直接按顺序遍历每个元素,并把它们存到一个数组中,然后反向输出我们存储在数组中的元素:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printReverseList(list) {
  let arr = [];
  let tmp = list;

  while (tmp) {
    arr.push(tmp.value);
    tmp = tmp.next;
  }

  for (let i = arr.length - 1; i >= 0; i--) {
    alert( arr[i] );
  }
}

printReverseList(list);

请注意,递归解法实际上也是这样做的:它顺着链表,记录每一个嵌套调用里链表的元素(在执行上下文堆栈里),然后输出它们。

原链接:递归和堆栈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输出一个单链表&&反向输出一个单链表(最后有原链接) 的相关文章

  • 将 OoXml 插入单词抛出错误:未知

    我一直在尝试通过office js将OOXML插入到word文档的正文内容中insertOoXML 方法 我什至尝试过最简单的实现 认为我在尝试替换 XML 本身中的 fieldCodes 时做了一些不正确的事情 所有结果都是这样Error
  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • CPU、GPU、DPU、TPU、NPU...傻傻分不清楚?实力扫盲——安排

    人工智能的发展离不开算力的支持 算力又是依附于各种硬件设备的 没有了算力设备的加持 就好比炼丹少了丹炉一样 可想而知 人工智能智能也就无用武之地了 以深度学习为主的人工智能方向的发展更是离不开强大的算力支持 随着深度学习的不断发展 各种各样
  • 登录验证,复杂验证

    效果如图
  • 程序员为什么要挤破头也要进大厂?别说是拧螺丝,递扳手我也愿意去!

    大家好 前段时间写了一篇关于程序员的年薪五十万指南 引起了一些共鸣 有些读者私信问我 现在不是大厂竞争很激烈吗 再说大厂的薪水待遇也没有比一些二线公司更好呀 既然如此 那为什么我们还要挤破脑袋进大厂呢 今天就和大家闲聊几句 以下说的仅代表我
  • K8S的卷、临时卷、持久卷、PV、PVC、SC

    博客 cbb777 fun 全平台账号 安妮的心动录 github https github com anneheartrecord 下文中我说的可能对 也可能不对 鉴于笔者水平有限 请君自辨 有问题欢迎大家找我讨论 为什么需要卷 容器中的
  • Maven项目添加mysql-connector-java依赖失败:dependency ‘mysql-connector-java‘not found

    在IDEA中搭建Scala项目 需要将处理过的数据存储到本地mysql数据库中 故需要在Maven的pom xml中添加mysql connector java依赖包 可能是我之前迁移AS项目时更改了在C盘User目录下的 m2 仓库文件
  • 对视觉目标检测的整体认知(基于目标检测综述)

    计算机视觉领域研究的绝大多数问题均存在诸多不确定性因素 因为图像理解是成像的逆过程 成像是从三维向二维投影的过程 在此过程中不仅会丢失深度信息 而且光照 材料特性 朝向 距离等信息都反映成唯一的测量值 即灰度或色彩 而要从这唯一的测量值中恢
  • 双向链表的实现

    定义一个双向链表 定义双向链表 typedef struct LinkNode int data 数据域 LinkNode next 下一个节点 LinkNode last 上一个节点 LinkNode 节点域 LinkList 头结点 初
  • NeRF:神经辐射场论文原理讲解

    一 新视角合成 NeRF是开创了一种全新的视角合成方法 新视角合成任务指的是给定源图像 Source Image 及对应的源姿态 Source Pose 以及目标姿态 Target Pose 渲染生成目标姿态对应的图片 Target 源姿态
  • java: 无法从静态上下文中引用非静态 方法

    Error 11 9 java 无法从静态上下文中引用非静态 方法 printArraylist java util ArrayList
  • 分享一个最好用的剪切板管理软件

    对于每一个离不开电脑的朋友来说 不断的复制 粘贴 剪切 粘贴 是常有的事 而且电脑断电 程序异常退出 因手欠而错关了编辑器等类似噩梦经常发生 之前我找到一个名叫 M8 Free Clipboard 是用起来还算方便 可是免费用户只能保存有限
  • LLc用simplis 如何建模

    简单来说 Simplis 模型的建模方法包括 数据预处理 特征工程 模型设计和调参 首先 需要收集所需的数据 并对数据进行预处理 清洗和标准化 然后 需要进行特征工程 确定哪些特征有助于模型预测 并调整特征以提高模型准确性 接下来 根据数据
  • 【初识Git工具】Git工具的基本介绍

    初识Git工具 Git工具的基本介绍 一 什么是Git 1 1 Git简介 1 2 Git和SVN区别 1 3 常用的Git工具 二 Git的起源 三 Git的优点 四 Git的架构 五 Git的基本概念 5 1 仓库 Repository
  • 电子邮件链接mailto_“ 3个链接”电子邮件的历史记录以及曾经发送的每个链接的存档...

    电子邮件链接mailto by Quincy Larson 昆西 拉尔森 Quincy Larson 3个链接 电子邮件的历史记录以及曾经发送的每个链接的存档 The history of the 3 links email and an
  • 深入理解overlayfs(一):初识

    版权声明 本文为CSDN博主 luckyapple1028 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net luckyapple1028 article d
  • Python-爬虫初体验

    在网易云课堂上看的教学视频 现在来巩固一下知识 先确定自己要爬的网站 以新浪新闻网站为例确 import requests 跟java的导包差不多 python叫导入库 res requests get http news sina com
  • Android 集成 Flutter

    前言 使用 Flutter 已经有一段时间了 开发体验还是非常好的 但是一般我们在正式使用 Flutter 的时候很少会去创建一个纯 Flutter 项目 而是需要在之前的项目中已集成的方式来编写 Flutter 这篇文章将以如何在 And
  • MySQL基础篇-第00章_写在前面

    第00章 写在前面 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com 一 MySQL数据库基础篇大纲 MySQL数据库基础篇分为5个篇章 1 数据库概述与MySQL安装篇 第01章 数据库概述 第02章
  • AC-Campus准入控制--Mac

    MAC认证 简介 MAC地址认证是一种基于端口和MAC地址对用户的网络访问权限进行控制的认证方法 它不需要用户安装任何客户端软件 用户名和密码都是用户设备的MAC地址 网络接入设备在首次检测到用户的MAC地址以后 即启动对该用户的认证 用户
  • 图像分类比赛

    cp data wanghd s4 data car data data wanghd whd 使用该命令报错 添加 r 可以实现正常复制 速度非常快 参考博客得到解决 Linux常见错误 cp omitting directory 解决办
  • 输出一个单链表&&反向输出一个单链表(最后有原链接)

    输出一个单链表 假设我们有一个单链表 let list value 1 next value 2 next value 3 next value 4 next null 编写一个可以逐个输出链表元素的函数 printList list 使用