前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer_23_链表中环的入口节点

剑指offer_23_链表中环的入口节点

作者头像
用户6055494
发布2019-09-24 16:01:37
3760
发布2019-09-24 16:01:37
举报
文章被收录于专栏:AVAJ
思路:

定义两个"指针",这俩个"指针"一快一慢,比如说一个"指针"每次移动一步,而另一个"指针"每次移动俩步,如果这俩个指针相遇了,那么说明链表里存在环。

相遇了之后固定一个"指针",让另一个"指针"每次移动一格,第二次相遇的时候记录另一个"指针"移动的步数,也就是环的大小了记为m步。

得到环的大小之后,我们只需要从链表头开始先让一个"指针"先移动m步,也就是环的大小,再让另一个"指针"从链表头开始移动,这样当俩个"指针"相遇的时候,就是链表中环的入口啦。代码如下:

代码语言:javascript
复制
// 链表中环的节点入口
public static ListNode findNode(ListNode node) {
    if (node == null ) {
        return null;
    }
    // 找到在环中相遇的节点
    ListNode mettingNode = findMettingNode(node);
    // 求取环的大小
    int count = findCount(mettingNode);
    // 求出环的开始节点
    return findStartNode(node, count);
}

// 找到指针在链表相遇的节点
public static ListNode findMettingNode(ListNode node) {
    ListNode fast = node;
    ListNode slow = node;
    if (node.next == null) {
        return null;
    }
    while ((fast = fast.next) != null && (slow=slow.next.next) != null ) {
        if (fast == slow) {
            return fast;
        }
    }
    return null;
}

// 求取链表中环的大小
public static int findCount(ListNode node) {
    // 定义俩个"指针"
    if (node == null) {
        return 0;
    }
    ListNode move = node;
    int count = 0;
    while ((move = move.next) != null) {
        count++;
        if (move == node) {
            return count;
        }
    }
    return 0;
}
// 求环所在的节点
public static ListNode findStartNode(ListNode node,int count) {
    if (count == 0) {
        return null;
    }
    ListNode nodeFirst = node;
    ListNode nodeLast = node;

    while (count != 0) {
        count--;
        nodeFirst = nodeFirst.next;
    }
   while (nodeFirst != nodeLast) {
        nodeFirst = nodeFirst.next;
        nodeLast = nodeLast.next;
   }
   return nodeFirst;
}

总结:其实就是三步曲:先找到在环中相遇的节点、再求出环的大小、最后得到环开始的节点。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档