链表专题
链表成环问题
问题描述:如果判断链表是否成环?
进阶问题:如果找出该环的入口,本问题对应力扣141、142俩道题
https://leetcode-cn.com/problems/linked-list-cycle-ii/
https://leetcode-cn.com/problems/linked-list-cycle/
基础问题解答
判断链表成环的思路非常简单,只需要用快慢指针就可以实现,想象你在操场跑步,一人跑的快,一人跑的慢,是不是总是会相遇,为什么,因为操场是圆的,只要你的速度一直是快的,总会存在 Sa-Sb=nL(Sa是快男[ps:没有开车哈]的路程,Sb是慢男的距离,L是圆的距离)
那么当你要用程序表示的时候就需要考虑用什么来制造一个快一个慢?这里不懂的同学要思考几分钟,想想如何表示快慢。
主流的快慢的指针做法是fast指针一次走俩步,slow指针一次走一步,通过这样来实现一个块,一个慢,而这种做法也为或许找环的入口提供了便利的方法。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL)
return false;
ListNode *slow,*fast;
slow=fast=head;
while(fast && fast->next){
//fast一次走俩步
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
return true;
}
return false;
}
};
进阶问题
如何找到环的入口,这里就要摆上一些数