链表中环的入口结点

本文介绍了一种高效算法来确定链表中环的入口节点。通过双指针技巧找到环内相遇点,并计算环的长度,最终确定环的入口节点。

题目描述
一个链表中包含环,请找出该链表的环的入口结点。

/**
 * 链表中环的入口节点
 * 
 * @author 过路的守望
 *
 */
public class EntryNodeOfLoop {

    public ListNode getEntryNodeOfLoop(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        ListNode firstListNode = head;
        ListNode secondListNode = head;
        ListNode node = getNodeOfLoop(firstListNode, secondListNode);
        int len = getLengthOfLoop(node);
        //当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。
        while (len > 0) {
            firstListNode = firstListNode.next;
            len--;
        }
        while (firstListNode != secondListNode) {
            firstListNode = firstListNode.next;
            secondListNode = secondListNode.next;
        }
        return firstListNode;

    }

    /**
     * 找环中相汇点。分别用first,second指向链表头部,first每次走一步,second每次走二步,直到first == second找到在环中的相汇点。
     * @param first
     * @param second
     * @return
     */
    public ListNode getNodeOfLoop(ListNode first, ListNode second) {
        first = first.next;
        while (first != second) {
            first = first.next.next;
            second = second.next;
        }
        return first;
    }

    /**
     * 求出环中节点数量
     * @param node
     * @return
     */
    public int getLengthOfLoop(ListNode node) {
        ListNode cur = node;
        int len = 1;
        while (cur.next != node) {
            cur = cur.next;
            len++;
        }
        return len;
    }

    /**
     * 
     * 链表类
     *
     */
    private static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值