Javascript实现删除链表节点时改变对象内存
Javascript alteration of memory of object when implementing deleting node in 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 = 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。您将 slow 和 fast 设置为 resultHead,因此修改 slow.next 会修改 head.
即
slow === resultHead
resultHead.next === head
slow.next === head
我需要一些关于 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。您将 slow 和 fast 设置为 resultHead,因此修改 slow.next 会修改 head.
即
slow === resultHead
resultHead.next === head
slow.next === head