【问题标题】:Why this JS destructuring assignment method works for reverse the singly linked list?为什么这个 JS 解构赋值方法适用于反向单链表?
【发布时间】: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 的代码实际上是如何工作的?

【问题讨论】:

标签: javascript linked-list


【解决方案1】:

[current.next, prev, current] = [prev, current, current.next]; 是一种数组解构语法,它可以在不显式保留临时变量的情况下工作,因为引用保存在数组中

你可以把上面的代码想象成

const arr = [];
arr[0] = prev;
arr[1] = current;
arr[2] = current.next;

current.next = arr[0];
prev = arr[1];
current = arr[2]

原始元素的引用保存在数组中而不是单个变量中

【讨论】:

    【解决方案2】:

    使用解构赋值来交换变量,不需要临时变量。

    var a = 1;
    var b = 3;
    
    [a, b] = [b, a];
    console.log(a); // 3
    console.log(b); // 1
    

    Swapping variablesSection with Destructuring on MDN

    有关语言规范的详细信息,请参阅 briosheje 的答案中链接的 ECMAScript 文档。

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2021-09-10
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多