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是報異常的