Почему этот метод назначения деструктуризации JS работает для обратного односвязного списка? - PullRequest
1 голос
/ 16 мая 2019

Я задаю вопрос с кодом 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 ]

1 голос
/ 16 мая 2019

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

где ссылка на исходные элементы хранится в массиве, а не на отдельных переменных

0 голосов
/ 16 мая 2019

При использовании присвоения деструктурирования для замены переменных временные переменные не нужны.

var a = 1;
var b = 3;

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

См. Обмен переменных. Раздел с разрушением на MDN

См. Документы ECMAScript, связанные вОтвет briosheje для деталей спецификации языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...