Practice makes perfect!
实战一:
带环问题其实我们小学时就接触过,就比如在操场上比赛跑步的追击问题,这里也是一样,如果我们定义两个指针,一个快指针,一个慢指针,快指针走的快,一次走两步,慢指针一次走一步,那么如果有环的话这两个指针一定就会相遇。
bool hasCycle(struct ListNode *head) {struct ListNode* fast=head;struct ListNode* slow=head;while(fast&&fast->next)
{fast=fast->next->next;slow=slow->next;if(fast==slow)return true;
}
return false;
}
实战二:
这个题是上道题的升级版本,不仅需要你判断还要你返回环的位置,我们如果两个指针在相遇点相遇了,慢指针从相遇点开始走,头结点从初始位置开始走,那么他们一定会在入环的位置相遇。想到这里我们这个题是不是就迎刃而解了呢。
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast=head;struct ListNode* slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){struct ListNode* meet=slow;while(meet!=head){head=head->next;meet=meet->next;}return meet;}}return NULL;
}
方法来自于实践,在实践中积累方法,继续加油!