【Java语言】剑指offer系列之链表、双指针法----链表中环的入口结点

题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

分析:

    // 双指针法(快慢指针),快指针每次走两步,慢指针每次走一步,若两者能够相遇,则证明存在环。建议画图。
    // 寻找环入口,当两者相遇时,将快指针设置其指向头节点,然后每次走一步,慢指针不变,然后两者接着走,再次相遇时即为环的入口。

具体代码实现如下:

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
     

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
     
        // 双指针法(快慢指针),快指针每次走两步,慢指针每次走一步,若两者能够相遇,则证明存在环。建议画图。
        // 寻找环入口,当两者相遇时,将快指针设置其指向头节点,然后每次走一步,慢指针不变,然后两者接着走,再次相遇时即为环的入口。
        if(pHead == null) return null; // 非空判断
        ListNode fast = pHead;// 将快慢指针都设置在起点处
        ListNode slow = pHead;
        while(fast.next != null ){
     
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
     // 快慢指针相等,则存在环
                 fast = pHead;// 将快指针置为起点(头节点)
                while(fast != slow){
     // 再次相遇则为环的入口
                    fast = fast.next;
                    slow = slow.next;
                }
                return fast;
            }
        }
        return null;
    }
}

人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
-----------纳兰性德

小白寄语:学如逆水行舟,不进则退。

你可能感兴趣的:(数据结构与算法基础,牛客网,剑指offer,指针,链表,java,单链表)