在自己实现这道算法题时出现了一些疑问,麻烦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回答

liuyubobobo

2019-09-29

问题描述的很清楚:)


第一个代码的问题在于,如果,我们一开始删除的是 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


这是正确的:)


看看能不能理解?


继续加油!:)

0
1
Declee
谢谢bobo老师,理解了!
2019-09-29
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程