zoukankan      html  css  js  c++  java
  • [LeetCode]141. Linked List Cycle判断循环链表

    快慢指针用来判断循环链表  记住

    快慢指针有四种常用的应用场景:

    1.找到有序链表的中点,快指针到头的时候,慢指针就是中点。

    2.判断是不是循环链表,快慢指针相遇就是

    3.找到循环链表的起点,以链表头结点开始的结点和以快慢指针相遇结点为开始的结点,这两个结点相遇的地方就是开始

    4.判断两个链表是不是相交。将其中一个链表收尾相接,然后判断另外一个链表是不是循环链表。

    有个博客写的很好:

    http://blog.csdn.net/willduan1/article/details/50938210

    看见循环链表就向快慢指针,就向看见BST就想中序遍历一样

    public boolean hasCycle(ListNode head) {
            /*
            看的答案,快慢指针,如果一个链表是循环链表,那么快慢指针一定会相遇
            因为快指针肯定会套慢指针一圈,就跟跑步套圈一样
             */
            if (head==null) return false;
            ListNode slow = head;
            ListNode fast  = head;
            while (fast!=null&&fast.next!=null)
            {
                slow = slow.next;
                fast = fast.next.next;
                if (fast==slow) return true;
            }
            return false;
        }

     第二题是找到循环链表的开始

    public ListNode detectCycle(ListNode head){
            /*
            快慢指针的一个应用,找到链表的循环开始的节点
            方法是:一个节点的从链表开头开始,一个节点从快慢节点的相遇点开始,一起走,每次一步,相遇的地方是就是循环的开始
             */
            if (head==null||head.next==null) return null;
            //快慢指针找到相遇的地方
            ListNode slow = head;
            ListNode fast  = head;
            while (fast!=null&&fast.next!=null)
            {
                slow = slow.next;
                fast = fast.next.next;
                if (fast==slow) break;
            }
            //如果fast或者fast的next是null,说明没有环
            if (fast==null||fast.next==null) return null;
            slow = head;
            while (fast!=slow)
            {
                fast = fast.next;
                slow = slow.next;
            }
            return slow;
        }
  • 相关阅读:
    学习笔记 线程异步请求过程
    学习笔记 urllib
    学习笔记 requests + BeautifulSoup
    python3 kmp 字符串匹配
    python3:实现字符串的全排列(有重复字符)
    python3:实现字符串的全排列(无重复字符)
    python 贝叶斯算法
    knn算法
    python基础5
    python基础4
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8435048.html
Copyright © 2011-2022 走看看