判斷鏈表有環

       題目:
       有一個單向鏈表,表中可能出現環,怎麼判斷是否有環。

       思路:
              
       首先創建兩個指針p1和p2,讓他們同時指向這個鏈表的頭結點,然後開始一個大的循環,在循環體中,讓指針p1每次向後移動一個結點,讓p2每次向後移動2個結點,然後比較兩個指針指向的結點是否相同,如果相同,則可以判斷出鏈表有環,如果不同,繼續下一次循環。

getRingLength則是來計算環長度的

public class isCycle {

    public static boolean isCycle(Node head){
        Node p1 = head;
        Node p2 = head;
        while(p2!=null && p2.next !=null){
            p1 = p1.next;
            p2 = p2.next.next;
            if(p1 == p2){
                return true;
            }
        }
        return false;
    }

    public static int getRingLength(Node head){
        int RingLength = 0;
        Node fast = head;
        Node slow = head;
        for(;;){
            fast = fast.next.next;
            slow = slow.next;
            RingLength++;
            if(fast == slow){
                break;
            }

        }
        return RingLength;
    }



    private static class Node{
        int data;
        Node next;
        Node(int data){
            this.data = data;
        }
    }

    public static void main(String[] args) throws Exception{
        Node node1 = new Node(5);
        Node node2 = new Node(3);
        Node node3 = new Node(7);
        Node node4 = new Node(8);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node2;
        System.out.println(isCycle(node1));
        System.out.println(getRingLength(node1));
    }
}

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