猿问

为什么这个JS解构赋值方法适用于反向单链表?

我正在做一个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?的引用?


大话西游666
浏览 558回答 2
2回答

翻阅古今

[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猫

使用解构赋值来交换变量不需要临时变量。var a = 1;var b = 3;[a, b] = [b, a];console.log(a); // 3console.log(b); // 1请参阅在MDN上使用Destructuring交换variablesSection请参阅briosheje关于语言规范详细信息的答案中链接的ECMAScript文档。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答