其他分享
首页 > 其他分享> > 剑指offer23:链表中环的入口节点

剑指offer23:链表中环的入口节点

作者:互联网

解法1:利用集合
思路:利用集合判断节点是否重复出现,第一个重复出现的节点就是入口节点
代码:
public class A2 {

static class ListNode{
    ListNode next;
    int val;
}

public static ListNode circleEntrance(ListNode head){
    if(head==null||head.next==null) return null;    //当只有head一个节点的时候,并且head不指向自己,则无环
    ListNode p = head,q=p.next;
    while(null!=q&&p!=q){   //有环则快指针会追上慢指针
        p = p.next;
        q = q.next;
        if(q==null) return null;
        q = q.next;
    }
    if(q==null) return null;
    int nodecountInCircle=1;        //环中节点的个数
    while(q.next!=p){
        nodecountInCircle++;
        q=q.next;
    }
    p=head;
    q=head;
    for (int i = 0; i < nodecountInCircle; i++) {
        q = q.next;
    }
    while(p!=q){
        p= p.next;
        q= q.next;
    }
    return p;
}

}

解法二:快慢指针
思路:慢指针走1步,快指针走两步,若有环,快指针会追得上慢指针,利用两个指针求出环中的节点个数
代码:
public class A2 {

static class ListNode{
    ListNode next;
    int val;
}

public static ListNode circleEntrance(ListNode head){
    if(head==null||head.next==null) return null;    //当只有head一个节点的时候,并且head不指向自己,则无环
    ListNode p = head,q=p.next;
    while(null!=q&&p!=q){   //有环则快指针会追上慢指针
        p = p.next;
        q = q.next;
        if(q==null) return null;
        q = q.next;
    }
    if(q==null) return null;
    int nodecountInCircle=1;        //环中节点的个数
    while(q.next!=p){
        nodecountInCircle++;
        q=q.next;
    }
    p=head;
    q=head;
    for (int i = 0; i < nodecountInCircle; i++) {
        q = q.next;
    }
    while(p!=q){
        p= p.next;
        q= q.next;
    }
    return p;
}

}

标签:head,ListNode,offer23,中环,next,链表,return,null,指针
来源: https://www.cnblogs.com/nickyBlog/p/15335037.html