背景:leetcode数据结构部分题目,之前leetcode很多部分不明白,所以链表那道基础题没有通过,下回会继续看。今天通过的是利用双指针判断链表是否有环的问题,下面做一丢丢记录。
对于这种题目,其实思路已经非常明白。这里的重点是注意到空指针这个边界条件,提示runtime估计就是空指针的问题。
首先将任务抽象为两种情况的终点,一种为有环,则两指针终于会相遇,一种为无环,那么一定会遍历出NULL。问题就是要考虑到所有的NULL情况。其实因为我们设定了以二为步长的指针之后,可以利用该指针及该指针的衍生遍历所有情况。所以就是有以下情况:
初始判断:空。单独。
偶判断:(fats=head->next;)fast->next==NULL
奇判断:fast->next->next=NULL;
编程的时候经常出现错误的地方在于,输入有误,这是因为好久没写代码导致的。比如next前面的符号->,就漏了一个-。然后最后梳理的时候发现问题清晰明了,但刚开始结题的时候还是操之过急,没有抽象问题。
另外,分享自己的一个错误,是自己一直卡着的错误(这里很感谢自己刚开始没发现的leetcode的提交反馈的信息,可以看到是哪一个样例错误了)。就是if(ptr2->next==NULL||ptr2->next->next==NULL)和if(ptr2->next->next==NULL||ptr2->next==NULL)是有区别的,C语言是讲究顺序的,所以只有先判断了ptr2->next的存在,才有ptr2->next->next存在。这个问题不该犯,暴露了编程习惯很有问题。