VS Code与LeetCode内置编辑器运行同份代码输出差异原因
运行结果差异的核心原因
两边运行表现不一致根本不是JS引擎的问题,是你传入函数的参数类型和LeetCode后台传入的参数类型完全不是一个东西。
- LeetCode运行题解时,会自动把你输入的数组用例
[1,2,3,4,5]预先转换为题目定义的单链表结构:每个节点是包含val(节点值)、next(指向下一节点的指针)两个属性的对象,头节点的next指向第二个节点对象,第二个节点next指向第三个,以此类推,尾节点的next为null。你在LC控制台看到head.next输出为“去掉首元素的数组”,只是控制台对链表对象的序列化展示效果,本质它是个链表节点,不是真的数组。 - 你在VS Code里直接调用
reverseList([1,2,3,4,5])时,传入的是JavaScript原生数组对象。原生数组默认没有符合链表规则的next指向,读取属性得到null是符合JS语法逻辑的结果,这时候你在循环里操作的根本不是链表节点,反转逻辑自然完全失效。
本地复现LeetCode运行效果的方法
你只需要补上LeetCode后台自动做的「数组转链表」步骤,再搭配个「链表转数组」的工具方法方便打印结果即可,参考代码如下:
// 复用LeetCode官方的单链表节点定义 function ListNode(val, next) { this.val = val === undefined ? 0 : val this.next = next === undefined ? null : next } // 把输入数组转换成符合题目要求的单链表 const arr2List = (arr) => { const dummy = new ListNode() let p = dummy for (const num of arr) { p.next = new ListNode(num) p = p.next } return dummy.next } // 把反转后的链表转回数组,方便直观查看结果 const list2Arr = (head) => { const res = [] let p = head while (p) { res.push(p.val) p = p.next } return res } const reverseList = (head) => { let prev = null; let curr = head; console.log(head.next); // 传入正确构造的链表后,这里打印的就是第二个链表节点,和LeetCode表现完全一致 while (curr) { const next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }; // 正确调用测试 const testHead = arr2List([1,2,3,4,5]) const reversedHead = reverseList(testHead) console.log(list2Arr(reversedHead)) // 最终输出 [5,4,3,2,1]
所有链表类题目本地调试时都要注意:不要直接把输入数组当链表传,必须先转成对应结构的节点对象,否则所有指针操作都会失效。
内容的提问来源于stack exchange,提问作者Jason2B3
相关产品推荐
相关产品推荐

