我需要一些关于 Javascript 内存如何工作的指导。在我从链表尾部删除第 n 个节点的实现中,我有一个占位符 resultHead。
在代码末尾,我让控制台记录 resultHead,第一次只是 head 的原始分配:
{"val":1,"next":{"val":2,"next":{"val":3,"next":{"val":4,"next":{"val":5,"next":null}}}}}
但是当我第二次看到这行代码时:
slow.next = slow.next.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< 的值之后
。
最佳答案
记住,JavaScript 通过引用传递对象。 resultHead.next = head 表示修改 resultHead.next 会从外部修改 head。您将 resultHead 设置为 Slow 和 Fast,因此修改 Slow.next 会修改 head。
即
slow === resultHead
resultHead.next === head
slow.next === head
关于实现删除链表中的节点时,Javascript改变对象的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55320611/