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