解决方法:双指针
1、单链表是否有环(力扣141题)
思路:初始化两个指针,一个快指针fast,一个慢指针slow,快指针移动的速度是慢指针的2倍。如果两个指针相遇,则代表单链表有环。
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow,fast;
slow=fast=head;
while(fast!=null && fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow)
return true;
}
return false;
}
}
2、单链表环的入口节点(力扣142题)
思路:已知单链表有环的情况下,找到环开始的位置。当快慢指针相遇时,让其中一个指针指向头结点,然后让两个节点以相同的速度前进,再次相遇时所在的节点位置就是环开始的位置。(数学上可证明,在此略过)
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null)
return null;
ListNode slow = pHead, fast = pHead;
do {
fast = fast.next.next;
slow = slow.next;
} while (slow != fast);
fast = pHead;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}