题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
根据题干,需要完成的任务如下
- 判断链表是否有环。
- 在有环的链表中找到环的入口。
找到入口所在位置:
//设快慢两个链表节点,设入口处与遇见处之间的距离为y;
//设遇见处与入口处的之间的距离为z;
//设链表表表头与入口处之间的距离为x;
//则可得出下列等式
//2(x+y)=x+y+z+y
//解得 x = z
//则利用这个思想编写如下代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//判断链表是否存在循环
public boolean hascucle(ListNode head){
if(head==null){
return false;
}
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(slow==fast){
return true;
}
}
return false;
}
//设快慢两个链表节点,设入口处与遇见处之间的距离为y;
//设遇见处与入口处的之间的距离为z;
//设链表表表头与入口处之间的距离为x;
//则可得出下列等式
//2(x+y)=x+y+z+y
//解得 x = z
//则利用这个思想编写如下代码:
public ListNode EntryNodeOfLoop(ListNode pHead) {
if( hascucle(pHead)==true){
ListNode pre = pHead;//表头
ListNode fast = pHead;//快指针
ListNode slow = pHead;//慢指针
//找到相遇节点
do{
fast = fast.next.next;
slow = slow.next;
}while(fast!=slow);
//一个从表头开始走,一个从相遇处开始走
//由于表头到入口处的距离与相遇处到入口的距离相等
//则这两链表相遇处为入口位置
while(pre!=slow){
slow = slow.next;
pre = pre.next;
}
return pre;
}
else{
return null;
}
}
}

查看2道真题和解析