面试题型:判断一个链表中是否成环
思路:
定义两个快慢指针,让他们一直移动,如果最终快指针=慢指针,这说明在这个链表中必然存在环。
首先,将快指针定义为fast,慢指针定义为slow,每次让快指针移动两个单位,慢指针移动一个单位;在链表中进行遍历。
没有成环的情况下,fast指针一定先移动到终点并返回null
成环的情况下,fast和slow一定在移动中相遇。此时,只需将fast重新回到head位置。接下来,fast指针每次移动一步,slow保持原状,继续遍历。
fast和slow指针再次相遇的节点就是成环的位置。
代码实现如下:
public void HashCycleIndex() {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
slow = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
System.out.println(slow.value);
return;
}
}
}