檢測鏈表中是否存在迴環(Java 版)

檢測鏈表中是否存在迴環,這裏介紹兩種方法:

  1. 快慢指針;
  2. HashSet 存儲原理;

1、快慢指針

快慢指針檢查,就是定義兩個指針,一個走的快,一個走的慢,如果鏈表中存在迴路,則快的指針最終會追上走的慢的;

就如在學校圓形跑道上跑步,跑的快的人最後還是能和跑的慢的人遇上,但是如果在直道上跑步,就不會遇上;

具體實現如下:

public class Node {
    int value;
    Node next;

    Node(int val) {
        this.value = val;
    }
}

private boolean circleCheck(Node head) {
        if (head == null) {
            System.out.println("鏈表不存在迴環");
            return false;
        }

        Node quick = head;
        Node slow = head;

        while (quick.next != null && quick.next.next != null) {
            slow = slow.next;
            quick = quick.next.next;

            if (quick == slow) {
                System.out.println("鏈表存在迴環");
                return true;
            }
        }

        System.out.println("鏈表不存在迴環");
        return false;
    }

2、HashSet 存儲原理

HashSet 存儲原理就是,同一個值在其中只能存在一個;這樣當我們遍歷鏈表的時候,判斷 HashSet 是否已存在當前節點的值,如果已存在說明有迴路,如果不存在,則將該節點的值放到 HashSet 中,直到遍歷結束;

具體實現如下:

public class Node {
    int value;
    Node next;

    Node(int val) {
        this.value = val;
    }
}

    public boolean hasCycle(Node head) {
        HashSet<Node> listNodes = new HashSet<>();
        Node currentNode = head;
        while (currentNode != null && currentNode.next != null) {
            if (listNodes.contains(currentNode)) {
                System.out.println("鏈表存在迴環");
                return true;
            }
            listNodes.add(currentNode);
            currentNode = currentNode.next;
        }

        System.out.println("鏈表不存在迴環");
        return false;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章