前提:首先要明白怎么判断有环的链表
问题:给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
要求:空间复杂度 O(1),时间复杂度 O(n)
思路:
1、设置两个指针,第一个指针作为循环条件,第二个指针作为置空指针。
2、当第一个指针下移时, 就将第一个指针的前面链表进行置空。
3、然后再次判断是否有环,如果返回ture,指针继续下移,同时通过一个节点对象进行当前节点的保存,如果返回的是false,就代表之前的节点就是环节点。
代码演示:
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode node=pHead;
ListNode listNode=null;
ListNode a=pHead;
while (node!=null){
if(hasCycle(node)){
listNode=new ListNode(node.val);
a=node;
node=node.next;
a.next=null;
}else{
return listNode;
}
}
return null;
}
public static boolean hasCycle(ListNode head) {
if (head==null){
return false;
}
ListNode node=new ListNode(-1);
node.next=head;
ListNode a=node;
ListNode h=head;
int i=0;
while (h!=null){
h=h.next;
i++;
if(i%4==0){
a=a.next;
}
if(h==a){
return true;
}
}
return false;
}