Javascript изменение памяти объекта при реализации удаления узла в связанном списке - PullRequest
0 голосов
/ 24 марта 2019

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

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

{"val": 1, "next":{ "VAL": 2, "следующий": { "VAL": 3, "следующий": { "VAL": 4, "следующий": { "VAL": 5, "следующий": нулевая}}}}}

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

slow.next = slow.next.next

Затем консоль регистрируетсяout:

{"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 Ответ

2 голосов
/ 24 марта 2019

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

т.е.

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