环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起。
1.题 | 如下:
2.题目分析:
返回的是一个布尔型的结果,如果有环返回true,无环返回false。
3.源代码:
bool hasCycle(struct ListNode *head) {
if(head==NULL)
return false;
struct ListNode *solw=head;
struct ListNode *fast=head;
while(fast && fast->next){
solw=solw->next;
fast=fast->next->next;//使快指针比慢指针快二步
if(solw==fast){
return true;//快慢指针相遇即有环
}
}
return false;//无环
}
1.题 || 如下:
2.题目分析:
3.源代码:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* slow=head;
struct ListNode* fast=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
break;//判断有环
}
if(fast==NULL||fast->next==NULL){
return NULL;//无环情况
}
else{
struct ListNode* meet=slow;
while(1){//由题目分析推断关系得如下且用while(1)死循环
if(meet==head)
break;//一定是先判断保证情况二也可以考虑到
head=head->next;
meet=meet->next;
}
return meet;
}
return 0;
}
4.总结:
1.解决类似问题以及链表中的问题可以多考虑用快慢指针解决。
2. 解决的第二题为什么快指针要比慢指针快二倍不可以是别的:
如果是三步:X X-2 X-4 X-6…如果X是奇数快慢指针就会错过不会像两步一样每走一步之间的距离每缩小一步。类推别的也就不可以。