Javascript изменение памяти объекта при реализации удаления узла в связанном списке

#javascript #javascript-objects #singly-linked-list

#javascript #javascript-объекты #single-linked-list

Вопрос:

Мне нужен некоторый указатель на то, как работает память в Javascript. В моей реализации удаления n-го узла из хвоста связанного списка у меня есть resultHead держателя места.

В конце кода у меня есть консольный журнал resultHead, и в первый раз это просто исходное назначение head:

{«val»: 1, «next»:{«val»:2,»next»:{«val»:3,»next»:{«val»:4,»next»:{«val»:5,»next»:null}}}}}

Но во второй раз после того, как у меня появилась эта строка:

slow.next = медленный.следующий.следующий

Затем консоль выходит из системы:

{«val»: 1, «next»:{«val»:2,»next»:{«val»:3,»next»:{«val»:5,»next»:null}}}}

 /**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    if(head.next === null){return null}
    // use resultHead as a place holder and its next is the actual head
    let resultHead = new ListNode(null);
    resultHead.next = head;
    // find the difference between fast and slow pointer
    let fast = resultHead; 
    let slow = resultHead; 
    for(let i=0; i<=n; i  ){
        fast=fast.next;

    }

    while(fast){
        slow = slow.next
        fast = fast.next   
    } 
    console.log(JSON.stringify(resultHead.next))
    slow.next = slow.next.next
    console.log(JSON.stringify(resultHead.next))
    return resultHead.next;
};


removeNthFromEnd({"val":1,"next":{"val":2,"next":{"val":3,"next":{"val":4,"next":{"val":5,"next":null}}}}}, 2)
  

Таким образом, код должен удалить узел с node.val = 4

Как можно slow.next = slow.next.next изменить значение resultHead ?

Я также пытался консольно регистрировать resultHead в разных местах, но только после того, как slow.next = slow.next.next изменилось значение resultHead .

Ответ №1:

Помните, javascript передает объекты по ссылке. resultHead.next = head означает изменение resultHead.next изменяет head извне. Вы устанавливаете значения slow и fast для resultHead, поэтому изменение slow.next изменяет head.

т.е.

 slow === resultHead
resultHead.next === head
slow.next === head
  

Комментарии:

1. Хорошо, итак, что происходит в цикле while, когда я устанавливаю slow = slow.next. Разве это не устанавливает переменную slow так, чтобы она указывала на другой объект (следующий узел в списке)? После завершения цикла он завершится на node.val = 3, теперь slow принимает ссылку на узел внутри resultHead?