141 环形链表(1)

351 阅读2分钟

这个题我之前刷过, 也不知道多少遍,距离上一次刷这道题应该有一个多月了,今天看过船长的第一课重新写,

方法一 快慢指针

第一步,不看答案,靠我自己之前的理解能写出如下

image.png 看到18行报错,想起来,没有判断fast.next,我写的是while(cur && cur.next)这个我刚开始while循环的时候 我在想我首先想到要循环那个链表,按照我的理解肯定是应该是循环cur,但是判断的时候,要去判断fast 所以我18行改成while(cur && fast.next),还是报错如下

image.png 我看报错,想到了head没有判空,所以出现了上面这个错误情况,所以我在最开始增加了 第1行代码进行判空,还是报错如下

image.png 这个报错是说fast.next。next 为空报错,所以我想应该要增加fast.next 判空,但是我又看报错还是说fast为null报错,我仔细想了想 看不出来哪里错了所以只能去看之前写的答案。 看多答案以后发现循环的对象错了,我18行应该循环 fast 改成while(fast $ fast.next)都对了. 总结这个按照我自己现在理解,快慢指针的方法是对的,只是在写代码的时候 while应该循环谁,我想错了。强迫我自己按照正确的代码理解,循环fast,fast每次走两步while会一直循环,指导return true,强制终止while循环。现在仔细想想,如果没有环,也就不会一直while循环肯定有个节点是null,存在还的话就会一直循环除非,快慢指针相等也就是快指针比慢指针夺走了一圈。也就是说,存在还 return true 停止的时候 刚好是快指针比慢指针多走一圈的时候。

快慢指针那 我就差了while应该循环谁不是太明白,然后去看了助教讲的解题,快慢指针思路一样 但是为什么循环fast都没有说,我又去看了大圣老师的,突然想起来方法二这个解题思路,比较简单,一边成没有报错。 至于为什么循环fast 而不是循环slow 就是因为fast走得快,会更新遇到null,为什么不是循环cur,这个可能是我写其他链表题目弄混了 不过分追究了

方法二

这个完全理解,就是把循环到的每个值储存起来,循环下个节点的时候,先把下个节点看看之前储存过没有,如果储存过说明这个就是环形链表。

image.png