该题旨在判断给定的链表是否存在环,若存在,则返回环的起始节点。
方法一:
利用哈希集记录已访问过的节点,当发生重复访问时,则表示链表中存在环,并返回第一个重复的节点,若没有发现重复元素,则表示该链表中没有换,返回null。
public class Solution {
public ListNode detectCycle(ListNode head) {
Set<ListNode> visited = new HashSet<ListNode>();
ListNode node = head;
while (node != null) {
if (visited.contains(node)) {
return node;
}
visited.add(node);
node = node.next;
}
return null;
}
}
方法二:
利用双指针法,慢指针一次后移一个节点,快指针一次后移两个节点;
当两个指针相遇时,令快指针指向头结点,并让两个指针都逐次后移一个节点;
当两个指针第二次相遇时,他们相遇的节点即为链表中环的起始节点。
该方法详细的数学分析过程可以参考文章:
环形链表 II(双指针法,清晰图解)
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(true){
if(fast == null || fast.next == null){
return null;
}
slow = slow.next;
fast = fast.next.next;
if(slow == fast)break;
}
fast = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
来源:CSDN
作者:codErVing
链接:https://blog.csdn.net/er_ving/article/details/104292538