/*
* 面试题23:链表中环的入口节点
* 题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null
* 思路:定义快慢两个指针,相遇后(环中相汇点)将快指针指向pHead 然后一起走,每次往后挪一位,相遇的节点即为所求。
* 详细分析:相遇即p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;
* 可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
*/
public class No23EntryNodeOfLoop {
public static void main(String[] args) {
No23EntryNodeOfLoop n = new No23EntryNodeOfLoop();
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
ListNode e = new ListNode(5);
ListNode f = new ListNode(6);
a.next = b;
b.next = c;
c.next = d;
d.next = e;
e.next = f;
f.next = c;
System.out.print(n.EntryNodeOfLoop(a).val);
}
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null) {
return null;
}
//定义快慢两个指针
ListNode slow = pHead;
ListNode fast = pHead;
//当fast指针不为空
while (fast != null && fast.next != null) {
slow = slow.next;//慢指针一次走一步
fast = fast.next.next;//快指针一次走两步
//如果快慢指针相遇
if (slow == fast) {
//将快指针指向pHead 然后一起走
fast = pHead;
while (fast != slow) {
//两个指针以相同的速度向前移动
fast = fast.next;
slow = slow.next;
}
//相遇的节点即为所求
if (fast == slow) {
return slow;
}
}
}
return null;
}
}
面试题23:链表中环的入口节点
最新推荐文章于 2024-08-16 14:36:32 发布