在链表中实现删除节点时对象内存的Javascript更改

在链表中实现删除节点时对象内存的Javascript更改,javascript,javascript-objects,singly-linked-list,Javascript,Javascript Objects,Singly Linked List,我需要一些关于Javascript中内存如何工作的指针。在我从链表尾部删除第n个节点的实现中,我有一个占位符resultHead 在代码的末尾,我将控制台日志记录为resultHead,第一次只是头的原始分配: {“val”:1,“next”:{“val”:2,“next”:{“val”:3,“next”:{“val”:4,“next”:{“val”:5,“next”:null}} 但在我说这句话之后的第二次: slow.next=slow.next.next 然后控制台注销: {“val”:1

我需要一些关于Javascript中内存如何工作的指针。在我从链表尾部删除第n个节点的实现中,我有一个占位符resultHead

在代码的末尾,我将控制台日志记录为resultHead,第一次只是头的原始分配:

{“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}}

/**
*单链表的定义。
*函数列表节点(val){
*this.val=val;
*this.next=null;
* }
*/
/**
*@param{ListNode}head
*@param{number}n
*@return{ListNode}
*/
var removeNthFromEnd=函数(头部,n){
if(head.next==null){return null}
//使用resultHead作为占位符,其下一个是实际的头部
让resultHead=newlistnode(null);
结果AD.next=头部;
//找出快速指针和慢速指针之间的区别
让fast=resultHead;
让slow=resultHead;

对于(让i=0;i记住,javascript通过引用传递对象。resultHead.next=head意味着修改resultHead.next从外部修改head。您可以将slow和fast设置为resultHead,以便修改slow.next修改head

i、 e


请记住,javascript通过引用传递对象。resultHead.next=head意味着修改resultHead.next会从外部修改head。您可以将slow和fast设置为resultHead,因此修改slow.next会修改head

i、 e


好的,那么当我设置slow=slow.next时while循环会发生什么呢?它不是将slow变量设置为指向另一个对象(列表中的下一个节点)吗?循环结束后,它将在node.val=3结束,现在slow是否在resultHead中获取节点引用?好的,那么当我设置slow=slow.next时while循环中会发生什么。它不是将slow变量设置为指向不同的对象(列表中的下一个节点)吗?循环结束后,它将在node.val=3处结束,现在slow是否在resultHead内获取节点引用?
/**
 * 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)
slow === resultHead
resultHead.next === head
slow.next === head