1.链表中环的入口结点
【题目】
链表中环的入口结点给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出 null。
【代码】
package swear2offer.linkednode;
public class Loop {
/**
* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出 null。
*
* 思路:
* 快慢指针,快指针一次走两个,慢指针一次走一个,
* 二者最开始从起点走,然后在A点相遇,A点是在环内
* 然后让其中一个指针从起点重新出发,另一个在A点出发
* 二者每次都是走一步,二者再次相遇的地点就是环的入口点
*
* 特殊情况:
* 起点就是入口节点
* 没有环的情况
* 注意:漏掉了节点只有一个元素的情况,此时head.next.next是报异常的
* */
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null) return null;
if (pHead.next == null) return null;
ListNode slow,fast;
slow = fast = pHead;
slow = slow.next;
fast = fast.next.next;
while (slow != fast && slow !=null && fast != null) {
slow = slow.next;
fast = fast.next.next;
}
// 不存在环
if (slow != fast) return null;
slow = pHead;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
* 思路:
* 快慢指针,快指针一次走两个,慢指针一次走一个,
* 二者最开始从起点走,然后在A点相遇,A点是在环内
* 然后让其中一个指针从起点重新出发,另一个在A点出发
* 二者每次都是走一步,二者再次相遇的地点就是环的入口点
*
* 特殊情况:
* 起点就是入口节点
* 没有环的情况
* 注意:漏掉了节点只有一个元素的情况,此时head.next.next是报异常的