面试官:你来说说怎么判断链表有环?
AXin:什…什么是链表有环?
面试官:环都不知奥?喝乌俺~huan,环,就是下面这个样子,只会出现情况1和情况2,不会出现情况3这种。而且环有且只有一个,一定包含最后一个节点。(PS:情况3已经是有向图了,不是链表)

AXin:我…我想一想。
面试官:别墨迹了,你就说你会不会吧?
【30分钟后…】
AXin:我想到了!
面试官:快说!我两把王者都打完了!
AXin:好嘞!用两个指针,指针A一次向前走一步,指针B一次向前走两步,如果指针A和指针B能够相遇,说明链表中有环。
面试官:算你聪明,解释解释怎么个走法。
AXin:我拿张纸划给你看,你就知道了。
【片刻之后…】
AXin:当当当当!看图!

面试官:不错!有那味儿了。图画得挺好!你懂美术?
AXin:略懂~ 略懂~
面试官:光画图没用,你给我把代码写出来!
AXin:好!
【片刻之后】
AXin:请您过目!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if(NULL == head)
return false;
struct ListNode *fast = head;
struct ListNode *slow = head;
// 注意fast->next可能为空指针
while(slow && fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
return true;
}
return false;
}
面试官:好!明天来上班!
此种方法使用了两个指针,一个走得快,一个走得慢,称为“快慢指针”法。除了判断链表中是否有环,还可以解决其他类似的问题,例如:找出单链表中倒数第K个元素。可以思考一下怎么解决。

本文详细介绍了如何通过快慢指针法判断链表中是否存在环,并提供了具体代码实现。面试官提出问题后,AXin巧妙地运用双指针策略解答,最终获得面试官的认可。

1618

被折叠的 条评论
为什么被折叠?



