我需要一些关于Javascript中的内存如何工作的指针。在我从链表的尾部删除第n个节点的实现中,我有一个占位符resultHead。
在代码的最后我有控制台记录resultHead,第一次只是head的原始赋值:
{ “VAL”:1, “下一个”:{ “VAL”:2 “下一个”:{ “VAL”:3, “下一个”:{ “VAL”:4, “下一个”:{ “VAL”:5 , “下一步”:空}}}}}
但是我有这条线之后的第二次:
slow.next = slow.next.next
然后控制台注销:
{ “VAL”:1, “下一个”:{ “VAL”:2 “下一个”:{ “VAL”:3, “下一个”:{ “VAL”:5, “下一个”:空}}}}
/**
* 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.next修改头。
即
slow === resultHead
resultHead.next === head
slow.next === head