美文网首页二叉树之下
3. 关于链表中的环的问题

3. 关于链表中的环的问题

作者: 月巴月巴 | 来源:发表于2018-07-19 00:23 被阅读117次

这次主要解决的问题有

  1. 求环的长度
  2. 找到环的起点
  3. 起点到环开始的节点的距离

讲解和画图我放在代码注释里了。
并不是严格的数学推导,代码写的也不算严谨。

package linkedlist;

import leetcode.defaultstructure.ListNode;

import java.util.ArrayList;

/**
 * Created by creat on 2018/7/18.
 */
public class FindBeginNode {
    public static void main(String[] args) {
        FindBeginNode findBeginNode = new FindBeginNode();
        ListNode beginNodeInCycle;
        ListNode testNode = findBeginNode.createTestData(10, 5);
        ArrayList firstMetInfo = findBeginNode.findFirstMetNodeAndStepCountSince(testNode);
        ListNode firstMetNode = (ListNode)firstMetInfo.get(0);
        int lengthFromBeginToFirstMetNode = (Integer)firstMetInfo.get(1);
        System.out.println("First met length is " + lengthFromBeginToFirstMetNode);
        beginNodeInCycle = firstMetNode;
        int oneStepPointerMoves = (Integer)findBeginNode.findFirstMetNodeAndStepCountSince(beginNodeInCycle).get(1);
        System.out.println("Cycle length is " + oneStepPointerMoves);
        ArrayList cycleStarterInfo = findBeginNode.getCycleBeginNodeInfo(testNode, firstMetNode);
        ListNode cycleStarter = (ListNode)cycleStarterInfo.get(0);
        Integer nonCycleLength = (Integer)cycleStarterInfo.get(1);
        System.out.println("Cycle starts at " + cycleStarter.val + "th node");
        System.out.println("Non-Cycle length is " + nonCycleLength);
    }

    /**示例List 1,2,3,4,[5],6,7,8,9,10,[5],6,7,8,9,10,[5],6.......
     * 两个游标,一个一次走一步,一个一次走两步。他俩首次相遇点必然在环中
     * 1 2 3 4 [5] 6 7
     * 1 3 [5] 7 9 [5] 7
     * 如果首次相遇后,两个游标继续走,则慢游标走一圈的时候,快游标恰好走2圈
     * 7 8 9 10 5 6 7
     * 7 9 5 7 9  5 7
     * 也就是说,环的长度,就是此时慢游标走的次数
     */
    private ArrayList findFirstMetNodeAndStepCountSince(ListNode testNode) {
        ListNode oneStep = testNode;
        ListNode twoStep = testNode;
        int count = 0;
        while (true) {
            if (oneStep.val == twoStep.val && count != 0) {
                break;
            }
            oneStep = oneStep.next;
            twoStep = twoStep.next.next;
            count++;
        }
        ArrayList list = new ArrayList();
        list.add(oneStep);
        list.add(count);
        return list;
    }

    /** 示例List 1,2,3,4,[5],6,7,8,9,10,[5],6,7,8,9,10,[5],6.......
     * 在环中,从首次相遇点走到环的起点的距离 = 从List的起点走到环的起点的距离
     * 如下图所示,首次相遇地为7号Node,一个游标从1号node走,另一个从7号node走,相遇点恰好是5。
     * 1 2 3  4  5
     * 7 8 9 10  5
     */
    private ArrayList getCycleBeginNodeInfo(ListNode head, ListNode firstMetNode) {
        ListNode node1 = head;
        ListNode node2 = firstMetNode;
        int count = 0;
        while (true) {
            if (count!=0 && node1.val == node2.val) {
                break;
            }
            node1 = node1.next;
            node2 = node2.next;
            count++;
        }
        ArrayList info = new ArrayList();
        info.add(node1);
        info.add(count);
        return info;
    }

    private ListNode createTestData(int totalNodeNum, int circleStartsAt) {
        ArrayList<ListNode> nodes = new ArrayList<>();
        for (int i = 1; i <= totalNodeNum; i++) {
            nodes.add(new ListNode(i));
        }
        for (int i = 0; i < totalNodeNum - 1; i++) {
            nodes.get(i).next = nodes.get(i+1);
        }
        nodes.get(totalNodeNum-1).next = nodes.get(circleStartsAt - 1);
        return nodes.get(0);
    }

    private void printList(ListNode head) {
        int count1 = 0;
        while (count1 < 50) {
            System.out.print(head.val + ", ");
            head = head.next;
            count1++;
        }
    }
}

相关文章

  • 3. 关于链表中的环的问题

    这次主要解决的问题有 求环的长度 找到环的起点 起点到环开始的节点的距离 讲解和画图我放在代码注释里了。并不是严格...

  • 链表算法面试?看我就够了!——链表中存在环问题

    链表中存在环问题 3.1 判断链表是否有环 单链表中的环是指链表末尾的节点的 next 指针不为 NULL ,而是...

  • c语言判断链表是否有环

    1.问题描述 判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 ,链表中...

  • 2020-08-19

    单链表找环(floyd算法) 首先是示意图,链表中有环就是这种情况 问题是,在这样一个单链表中,若有环,寻找出环的...

  • 链表

    1.翻转链表链表的定义 翻转 快慢指针找链表 的中间位置 3.有序链表的合并 4.判断链表中是否有环解法1: 借助...

  • 判断链表中的环Floyd

    问题源于 leetcode 中的一道题:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 nul...

  • 链表 Leetcode 141 环形链表

    题目 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的...

  • Leetcode 141. 环形链表

    给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(...

  • leetcode141.环形链表

    给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(...

  • 2019-09-19 环形链表

    给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(...

网友评论

    本文标题:3. 关于链表中的环的问题

    本文链接:https://www.haomeiwen.com/subject/lqhzpftx.html