算法学习——关于链表问题的一些疑问

368 阅读2分钟

算法学习——关于链表问题的一些疑问

比如,链表,并不是js原有的数据类型嘛。是自己实现的,我做题前看了链表的基础实现。其实就是构造写的函数 new出来的实例。其头部节点实际上就是类似于下面这样的结构

head ={
  value:'',
  next:{
     value:'',
     next:{
       value:'',
       next:null
     }
  }
}

那说到底,节点其实也是个对象,是引用类型。

但为啥我看到题解过程,很多地方使用节点对象时就像使用基础值类型一样,只是简单的赋值没进行深浅拷贝,但是却能随意改变其值不影响赋值对象的值。因为正常来说,对象的话a=b,他们的值指向同一个引用,a的值变化,b的值也会变,因为指向同一个内存地址。

但是题解里很多地方却不是这样,比如下图

image.png  

反转链表时,我用nextNode暂时保存需要处理

的头部节点nowHead.next,最后再赋值给nowHead,达到断开原来链表头部的目的。

思路我理解,但是nextNode=nowHead.next;nowHead.next=newHead;如果nextNode是引用类型,那nextNode的值不是也跟着nowHead的重新赋值改变了么?但实际是没有,就好像处理基础值类型那样,直接就找个中间变量保存了。我不明白为啥会这样?

var reverseList = function(head) {
    if(!head)return null;
    let newHead=null;//创建新链表
    let nowHead=head;//得到现在需要反转的头部节点
    while(nowHead){//头部节点存在则触发继续循环
    let nextNode=nowHead.next;//把原head的next保存,
        nowHead.next=newHead;//把需要反转的头部,作为新链表的头部,得到新链表
        newHead=nowHead;//新链表存回去
        nowHead=nextNode;//断开原链表的头部
    }
    return newHead;


};