【数据结构】单链表练习(有环)
1.判断是否是环形链表
141. 环形链表 - 力扣(LeetCode)
bool hasCycle(struct ListNode *head)
{struct ListNode *fast,*slow;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow)return true;}return false;
}
2.环形链表2.0
142. 环形链表 II - 力扣(LeetCode)
思考:
slow走的路程:L+X
fast走的路程:L+N*C+X
2*(L+X)=L+N*C+X
L=N*C-X
结论:一个指针从相遇点开始走,另一个指针从起始点开始走,他们会在入口点相遇
struct ListNode *detectCycle(struct ListNode *head)
{struct ListNode *fast,*slow;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){struct ListNode *meet=slow;struct ListNode *start=head;while(meet!=start){start=start->next;meet=meet->next;}return meet;}}return NULL;
}