#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?