zoukankan      html  css  js  c++  java
  • lettcode 141/142 环形链表

    package com.example.lettcode.dailyexercises;
    
    /**
     * @Class DetectCycle
     * @Description TODO
     * @Author
     * @Date 2020/10/10
     **/
    public class DetectCycle {
        static class ListNode {
            int val;
            ListNode next;
    
            ListNode(int x) {
                val = x;
                next = null;
            }
        }
    
        /**
         * 141 环形链表
         * */
        public static boolean hasCycle(ListNode head) {
            // 使用快慢指针的方式,找到快慢指针的交点
            ListNode fast = head;
            ListNode slow = head;
            // 因为fast指针已经先判断了,就不用判断slow指针了
            while (fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 142 环形链表II
         * */
        public static ListNode detectCycle(ListNode head) {
            //使用快慢指针的方式,找到快慢指针的交点:
            ListNode fast = head;
            ListNode slow = head;
            while (fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast) {
                    //是带环链表
                    break;
                }
            }
            if (fast == null || fast.next == null) {
                //不是带环链表
                return null;
            }
            //带环的情况,设定两个引用,分别从链表头部和fast、slow交点出发,按照相同速度同时往后走
            ListNode cur1 = head;
            ListNode cur2 = fast;
            while (cur1 != cur2) {
                cur1 = cur1.next;
                cur2 = cur2.next;
            }
            //环的入口:
            return cur1;
        }
    
        public static void main(String[] args) {
            // [3,2,0,-4] 1
            ListNode head = new ListNode(3);
            ListNode node2 = new ListNode(2);
            head.next = node2;
            ListNode node3 = new ListNode(0);
            node2.next = node3;
            ListNode node4 = new ListNode(-4);
            node3.next = node4;
            node4.next = node2;
            ListNode listNode = detectCycle(head);
            System.out.println("DetectCycle demo01 result:" + listNode.val);
        }
    }
    
  • 相关阅读:
    Mybatis 动态sql(转载)
    mapper映射文件配置之select、resultMap(转载)
    mapper映射文件配置之insert、update、delete(转载)
    MyBatis主配置文件(转载)
    函数装饰器和闭包(二)
    函数装饰器和闭包(一)
    指针的指针(二)
    指针的指针(一)
    Makefile基础(三)
    Python之多线程与多进程(二)
  • 原文地址:https://www.cnblogs.com/fyusac/p/13796387.html
Copyright © 2011-2022 走看看