给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。
1.hash表方式
2.快慢指针(一个指针每次移动2下 一个只移动一下 如果存在环一定会有相等的时候(在环中,一个指针相对另一个指针移动速度为1)
- package TOP21_30;
-
- import Util.ListNode;
-
- import java.util.HashSet;
- import java.util.Set;
-
- // 环形链表
- /*
- 给你一个链表的头节点 head ,判断链表中是否有环。
- 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
- 如果链表中存在环 ,则返回 true 。 否则,返回 false 。
- */
- public class Top23 {
- //空间复杂度o(n)
- public static boolean hasCycle(ListNode head) {
- //hash表方式
- if(head==null){
- return false;
- }
- Set
nodeSet = new HashSet<>(); -
- while (head!=null){
- if(nodeSet.contains(head)){
- return true;
- }
- nodeSet.add(head);
- head=head.next;
- }
- return false;
- }
-
- // 快慢指针 一个指针每次移动2下 一个只移动一下 如果存在环一定会有相等的时候(在环中,一个指针相对另一个指针移动速度为1)
- //空间复杂度o(1)
- public static boolean hasCycle2(ListNode head){
- if(head == null){
- return false;
- }
- ListNode slow = head;
- ListNode fast = head.next;
-
- while (slow!=fast){
- if(fast == null ||fast.next ==null){
- return false;
- }
- slow = slow.next;
- fast = fast.next.next;
- }
- return true;
- }
- }
ListNode
- package Util;
-
- public class ListNode {
- public int val;
- public ListNode next;
-
- public ListNode() {
- }
-
- public ListNode(int val) {
- this.val = val;
- }
-
- public ListNode(int val, ListNode next) {
- this.val = val;
- this.next = next;
- }
-
- public static ListNode setNodes(int index,int[] nums){
- ListNode res = new ListNode();
- res.val = nums[index];
- if(index == nums.length-1){
- res.next = null;
- return res;
- }
- else{
- res.next = setNodes(index+1,nums);
- }
- return res;
- }
-
- public static void printListData(ListNode node){
- while (node!=null){
- System.out.println(node.val);
- node = node.next;
- }
- }
- }