问题1:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环 ,则返回 true 或者false 。
方法:首先判断链表是否为空,以及是否只有一个结点。接下来利用快慢指针,slow走一步,fast走两步,在fast不为null以及.next不为空的情况下,若能找到fast=slow的相遇点则链表中有环。
代码:
public boolean hasCycle(ListNode head) {
if(head==null){
return false;
}
if(head.next==null){
return false;
}
ListNode slow=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
return true;
}
}
return false;
}
问题2:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
方法:首先判断链表是否为空,以及是否只有一个结点。接下来:
1.先利用快慢指针,slow走一步,fast走两步,在fast不为null以及.next不为空的情况下,找到fast=slow的相遇点,由于fast走的是2的倍数,因此相遇点路程一定是偶数。
2.然后将slow放回head处,slow走一步,fast走一步(由于是环形链表,fast一直在圈里),入口点刚好是快路程的二分之一处,也是slow和fast相等的地方。由于相遇点路程为偶数,而Y为尾结点与前面数相连,则在偶数的基础上+1,因此入口点一定是slow与fast相等的点,不会出现偶数个的情况。
代码:
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null){
return null;
}
ListNode slow=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
slow=head;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return fast;
}
}
return null;
}
相关链接:
利用快慢指针找中点:JAVA——快慢指针解决链表相关问题(一)