如题1-->判断是否有环
解题思路
想象一下:在田径场跑1000米,同一起点出发,到最后还有人被别人拉开一圈的差距,这表示在环里只要速度不一样,一直运动下去就会出现拉开一圈的差距。所以在链环里遍历一次的跨度不一样,就会出现指针相等的情况即:
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
return true;
}
代码如下
bool hasCycle(struct ListNode* head ) {
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast && fast->next) {//如果不加上fast->next,则会仅判断第偶数个节点(0,2,4...)
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
return true;
}
}
return false;
}
注意,while循环里面的条件
while循环里的条件要保证循环语句中指针不能指向最后一个节点(假如是无环的链表)next域(=NULL)的下一个节点,不然野指针会导致程序崩溃或产生不可预料的行为。
while (fast && fast->next)解读:
- fast比slow指针快,fast先遍历到链表的后面;
- 条件为fast && fast->next可以保证循环语句里的指针不越界;
如题2-->找环入口
思路