问题汇总
-
给一个单链表,判断其中是否有环的存在;
-
如果存在环,找出环的入口点;
-
如果存在环,求出环上节点的个数;
-
如果存在环,求出链表的长度;
-
如果存在环,求出环上距离任意一个节点最远的点(对面节点);
-
如何判断两个无环链表是否相交;
-
如果相交,求出第一个相交的节点;
判断是否有环
思路
创建两个指针 fast 和 slow 指向头结点, 无限循环, 每次循环 fast 走两步, slow 走一步. 如果 fast 碰到 NULL 说明没有环, 如果 fast 碰到 slow 说明有环.
代码
int checkLoop(Node* head) {
Node* fast = head;
Node* slow = head;
while (1) {
fast = fast->next;
if (fast == NULL) return 0;
fast = fast->next;
if (fast == NULL) return 0;
slow = slow->next;
if (fast == slow) return 1;
}
}
找出环的入口点
思路
这是个数学题, 首先要明白:
如果 fast 遇到了 slow, 说明 fast 比 slow 多走了整整 n 圈 ( n >= 1 )
这个理解了之后, 进行数学解答:
设 slow 走了 s s s 步, 则 fast 走了 2 s 2s 2s 步
设圈的长度为 L L L
因为 fast 比 slow 多走了整整 n 圈, 所以
2 s − s = s = n × L 2s - s = s = n \times L 2s−s