解题思路:
- 这类链表题目一般都是使用双指针法解决的,例如寻找距离尾部第K个节点、寻找环入口、寻找公共尾部入口等。
//环形链表相关
import java.util.HashSet;
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class testg {
//使用HashSet 解决 有重复的节点即为入口节点
public static ListNode detectCycle(ListNode head) {
if(head==null){
return null;
}
HashSet<ListNode> hashSet=new HashSet<>();
ListNode temp=head;
while(temp!=null){
if(temp.next==null){
return null;
}
boolean flag=hashSet.add(temp);
if(!flag){
return temp;
}
temp=temp.next;
}
return null;
}
public static ListNode detectCycle2(ListNode head) {
ListNode fast=head;
ListNode slow=head;
while(true){
if(fast==null||fast.next==null){
return null;
}
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
break;
}
}
fast=head;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast;
}
public static void main(String[] args) {
ListNode node1=new ListNode(3);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(0);
ListNode node4=new ListNode(-4);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node2;
//System.out.println(detectCycle(node1).val);
System.out.println(detectCycle2(node1).val);
}
}
注:
参考: