【发布时间】:2019-10-03 19:37:24
【问题描述】:
我正在做一个 leetcode 问题reverse singly linked list。
我尝试了以下代码,看看我是否错过了位置 1 的代码,结果会出错。我理解这是因为它失去了对current.next 的引用。 (感谢stackoverflow post。)
function ListNode(val) {
this.val = val;
this.next = null;
}
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let current = head;
let prev = null;
while (current) {
current.next = prev;
prev = current;
current = current.next;
//The right one
// let save = current.next; //1
// current.next = prev;
// prev = current;
// current = save;
}
return prev
};
问题是,我发现下面显示的另一个代码也可以通过使用数组解构赋值(名称对吗?),但我无法理解为什么如果不使用另一个变量来保存对current.next 的引用,这会起作用.
var reverseList = function(head) {
let current = head;
let prev = null;
while (current) {
[current.next, prev, current] = [prev, current, current.next];//2
}
return prev
};
那么在不使用另一个变量来保存对current.next 的引用的情况下,位置 2 的代码实际上是如何工作的?
【问题讨论】:
-
我认为解构赋值通过自动交换到
current.next与prev的临时变量来处理引用。你可能想看看官方的 ECMAScript2015 Semantics 关于运行时解构评估:ecma-international.org/ecma-262/6.0/… -
@adiga 你最后的评论应该是答案;)