You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Eloquent JavaScript习题4.3中nth函数实现的疑问

《Eloquent JavaScript》4.3节nth函数实现问题解答

1. 你的实现算不算“作弊”?

不算。习题没禁止复用已实现的listToArray函数,这种代码复用本身是合理的编程实践。但要注意:这个习题的核心目的是让你直接操作链表节点、练习链表遍历逻辑,转数组的方式相当于绕开了这个核心练习点,虽然结果正确,但没达到习题的训练意图。

2. 性能影响分析

确实会有性能损耗:

  • 你的实现需要先遍历整个链表转成数组,时间复杂度是O(n),还会额外创建一个数组占用内存(空间复杂度O(n))。
  • 而直接遍历到目标位置的实现,只需要遍历到第num个节点就停止,时间复杂度是O(k)(k为目标索引),且不需要额外内存(空间复杂度O(1))。
    如果链表很长且目标索引较小,你的方式会明显更慢,也更占内存。

3. 用指定for循环实现nth函数

直接用for (let node = list; node; node = node.rest)循环的实现如下:

function nth(list, num) {
  // 处理负数索引的边界情况
  if (num < 0) return undefined;
  
  for (let node = list; node; node = node.rest) {
    // 当前节点就是目标位置,返回值
    if (num === 0) {
      return node.value;
    }
    // 索引减1,继续找下一个节点
    num--;
  }
  
  // 遍历完整个链表都没找到对应索引,返回undefined
  return undefined;
}

逻辑说明:

  • 先判断索引是否为负数,直接返回undefined(因为题目要求0是第一个元素,负数无意义)。
  • 循环中每次检查当前索引是否为0:如果是,直接返回当前节点的value;否则索引减1,移动到下一个节点。
  • 如果循环结束(说明已经遍历到链表末尾)还没找到对应位置,返回undefined。

内容的提问来源于stack exchange,提问作者Mahide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:40:08