关于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
相关产品推荐
相关产品推荐

