链表环

链表环:

判断是否存在环:
        设置两个节点:slow、fast
        若存在环,必定会在环上的节点相遇

    public static boolean hasCircle(Node root){
        Node slow=root;
        Node fast=root;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(slow==fast){
                return true;
            }
        }
        return false;
    }   
//找环入口:
    头结点和相遇结点时,将slow指向root,同步前进,则最后一定相遇在环入口结点。
    fast、slow分别每次只走一步。
        /*           s = a + x
                     2s = a + nr + x
                     =>a + x = nr
                     =>a = nr - x
        */

    public static Node searchEntranceNode(Node root){
        Node slow=root;
        Node fast=root;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(slow==fast){
                break;
            }
        }
        if(fast==null||fast.next==null){
            return null;
        }
        slow=root;
        while(slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }
//求环的长度:
    获取环的入口地址、循环一圈、每次加1
public int  circleLength(Node root){
        Node node=searchEntranceNode(root);
        if(node==null){
            return 0;
        }
        Node n=node.next;
        int length=1;
        while(n!=node){
            length++;
            n=n.next;
        }
        return length;
    }

猜你喜欢

转载自blog.csdn.net/linkingfei/article/details/81811529