美文网首页
Java实现链表中环的检测

Java实现链表中环的检测

作者: 初心myp | 来源:发表于2019-06-13 14:12 被阅读0次

链表中环的检测,就是判断链表中是否存在环形结构。带有环形结构的链表如下图所示:

image.png

这里提供两种解决方法,判断链表中是否含有环形结构:

第一种:快慢指针法

思路:
有两个指针p1和p2,同时从头结点往下遍历链表中的所有结点。
p1是慢指针,一次遍历一个结点。
p2是快指针,一次遍历两个结点。
如果链表中没有环,p1和p2会先后遍历玩所有结点。
如果链表中有环,p1和p2会先后进入环中,一直在循环,并且一定会在某一次遍历中相遇。
因此,我们只要发现了p1和p2相遇了,就可以判断链表中一定存在环。


image.png

Java代码实现:

public class LinkADT<T> {

    /**
     * 单链表节点
     */
    private static class SingleNode<T> {
        public SingleNode<T> next;
        public T data;

        public SingleNode(T data) {
            this.data = data;
        }

        public T getNextNodeData() {
            return next != null ? next.data : null;
        }
    }

    /**
     * 判断是否有环 快慢指针法
     * 
     * @param node
     * @return
     */
    public static boolean hasLoopV1(SingleNode headNode) {
        
        if(headNode == null) {
            return false;
        }
        
        SingleNode p = headNode;
        SingleNode q = headNode.next ;

        // 快指针未能遍历完所有节点
        while (q != null && q.next != null) {
            p = p.next; // 遍历一个节点
            q = q.next.next ; // 遍历两个个节点

            // 已到链表末尾
            if (q == null) {
                return false;
            } else if (p == q) {
                // 快慢指针相遇,存在环
                return true;
            }
        }

        return false;
    }
}

第二种:足迹法

思路:顺序遍历链表中所有的结点,并将其结点信息都保存下来。如果结点信息出现了两次,则存在环。

Java代码实现:

public class LinkADT<T> {

    /**
     * 单链表节点
     */
    private static class SingleNode<T> {
        public SingleNode<T> next;
        public T data;

        public SingleNode(T data) {
            this.data = data;
        }

        public T getNextNodeData() {
            return next != null ? next.data : null;
        }
    }

    // 保存足迹信息
    private static HashMap<SingleNode, Integer> nodeMap = new HashMap<>();

    /**
     * 判断是否有环 足迹法
     * 
     * @param node
     * @return
     */
    public static boolean hasLoopV2(SingleNode node, int index) {
        if (node == null || node.next == null) {
            return false;
        }

        if (nodeMap.containsKey(node)) {
            return true;
        } else {
            nodeMap.put(node, index);
            return hasLoopV2(node.next, ++index);
        }
    }
}

相关文章

  • Java实现链表中环的检测

    链表中环的检测,就是判断链表中是否存在环形结构。带有环形结构的链表如下图所示: image.png 这里提供两种解...

  • 关于链表经典算法题都在这里了

    1.单链表反转(LeetCode 206) 2.链表中环的检测 (LeetCode 141) 3.求链表中环开始结...

  • 链表中环检测

  • 链表——链表中环的检测

  • 链表--链表中环的检测

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

  • 链表中环的检测

    1. 怎么检测一个单向链表中是否有环 同样借助于快慢指针,思路如下: 定义 fast、slow 两个指针同时指向链...

  • 链表中环的检测

  • 链表中环的检测

    思路一:哈希表 我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助...

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

网友评论

      本文标题:Java实现链表中环的检测

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