在自己实现这道算法题时出现了一些疑问,麻烦bobo老师看下
来源:5-1 Leetcode中和链表相关的问题
Declee
2019-09-29
bobo老师,第一张图与第二张图的代码除了方框框出的部分,其他都完全一样,但是第一张图运行失败,第二张图是成功的.根据图一左边错误的运行结果,应该是第二个while循环并没有运行,我推测是因为第一张图变量prev声明的太早,导致head的引用已经变化,但是prev却没有跟着变,还是指向原来的地址,这时我就有点儿转不过弯了,难道说是因为第一个while循环中的delNode.next = null导致第2个while循环中的prev.next=null,从而导致第二个while循环失败吗?(因为prev与delNode指向了同一个node,所以delNode.next = prev.next=null)可是之前不是说java变量名只是引用嘛,按理来说prev与delNode是不会相互影响的呀?
麻烦bobo老师分析下出错的原因,然后讲下我的想法哪里有错误.
打了很多字,可能要浪费bobo老师很多时间,麻烦老师了!
1回答
-
问题描述的很清楚:)
第一个代码的问题在于,如果,我们一开始删除的是 head 节点,但是,prev 将一直指着最初的 head 节点。在 while 循环中,只更新了head, prev 不会跟着更新。
比如,我们的链表是 1->2->3
对于你的第一个代码,初始,head 指向 1,prev = head 的意思是,prev指向和 head 一样的内存位置,也就是也是 1 节点的位置。
pre | 1-> 2 -> 3 | head
但是,现在要删除 1,在 while 循环中 ,head会跟着做变化,但是 pre不会。所以,删除掉 1 以后,就是这个样子了:
pre | 1 2 -> 3 | head
那么显然,后面的循环,直接找 pre.next,就错了。
但是,第二个代码,在head 编导正确的位置以后,pre = head,pre 指向此时 head 指向的内存,就是这样了:
pre | 1 2 -> 3 | head
这是正确的:)
看看能不能理解?
继续加油!:)
012019-09-29
相似问题