剑指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