static class ListNode{
private int val;
private ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
}
public static void main(String[] args) {
ListNode node5 = new ListNode(5, null);
ListNode node4 = new ListNode(4, node5);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);
node5.next = node2;
System.out.println("链表中是否存在循环元素:" + hasCycle(node1));
System.out.println("链表中是否存在循环元素:" + hasCycle2(node1));
}
//链表中是否存在循环元素
private static boolean hasCycle(ListNode node1) {
if (node1 == null || node1.next == null) {
return false;
}
ListNode low = node1;
ListNode high = node1.next;
while (low != high) {
if (high == null || high.next == null) {
return false;
}
low = low.next;
high = high.next.next;
}
return true;
}
//链表中是否存在循环元素
public static boolean hasCycle2(ListNode node) {
Set<ListNode> set = new HashSet<>();
while (node != null) {
if (!set.add(node)) {
return true;
}
node = node.next;
}
return false;
}
set.add如果添加的元素不存在,返回true,如存在,返回false