我正在做一个leetcode问题反向单链表。我尝试了下面的代码,看看我是否错过了第1位的代码,结果会出错。我理解这是因为它失去了对它的引用current.next。(感谢这个stackoverflow帖子。)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};那么第2位的代码如何实际工作而不使用另一个变量来保存对current.next?的引用?
2 回答

翻阅古今
TA贡献1780条经验 获得超5个赞
[current.next, prev, current] = [prev, current, current.next]; 是一个数组解构语法,它可以在不显式保持tempvariable的情况下工作,因为引用保存在数组中
你可以把上面的代码想象成
const arr = [];
arr[0] = prev;
arr[1] = current;
arr[2] = current.next;
current.next = arr[0];
prev = arr[1];
current = arr[2]
其中原始元素的引用保存在数组中而不是单个变量中

jeck猫
TA贡献1909条经验 获得超7个赞
使用解构赋值来交换变量不需要临时变量。
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
请参阅在MDN上使用Destructuring交换variablesSection
请参阅briosheje关于语言规范详细信息的答案中链接的ECMAScript文档。
添加回答
举报
0/150
提交
取消