算法学习——关于链表问题的一些疑问
比如,链表,并不是js原有的数据类型嘛。是自己实现的,我做题前看了链表的基础实现。其实就是构造写的函数 new出来的实例。其头部节点实际上就是类似于下面这样的结构
head ={
value:'',
next:{
value:'',
next:{
value:'',
next:null
}
}
}
那说到底,节点其实也是个对象,是引用类型。
但为啥我看到题解过程,很多地方使用节点对象时就像使用基础值类型一样,只是简单的赋值没进行深浅拷贝,但是却能随意改变其值不影响赋值对象的值。因为正常来说,对象的话a=b,他们的值指向同一个引用,a的值变化,b的值也会变,因为指向同一个内存地址。
但是题解里很多地方却不是这样,比如下图
反转链表时,我用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;
};