判断一个链表是否有环--剑指offer

来源:互联网 发布:游戏编程要学java 编辑:程序博客网 时间:2024/06/08 16:06

思路:如果开始有两个指针指向头结点,一个走的快,一个走的慢,如果有环的话,最终经过若干步,快的指针总会超过慢的指针一圈从而相遇。

class ListNode {    String val;    ListNode next;    public ListNode(String val) {        this.val = val;    }}public class Main {    boolean hasCycle(ListNode head) {        ListNode fast = head, slow = head;        while (fast != null && fast.next != null) {//这个条件“fast.next != null”需要加上,防止一个结点时报错。            fast = fast.next.next;//如果是3->null不报错,如果是如果是3->null->null则报错,因为空结点没有下一次个结点//            fast = fast.next.next.next.next;这里一次往后走四步也行,三步也行            slow = slow.next;            if (fast == slow)                return true;        }        return false;    }//hasCycle    //测试    public static void main(String[] args) {        ListNode node1 = new ListNode("A");        ListNode node2 = new ListNode("B");        ListNode node3 = new ListNode("C");        ListNode node4 = new ListNode("D");        ListNode node5 = node2;//这里是有无环,不是有无重复的结点数值!!!!        ListNode node6 = node3;        node1.next = node2;        node2.next = node3;        node3.next = node4;        node4.next = node5;        node5.next = node6;        System.out.println(new Main().hasCycle(node1));//true//        ListNode node1 = new ListNode("A");//        ListNode node2 = new ListNode("B");//        node1.next = node2;//        System.out.println(new Main().hasCycle(node1));//false//        ListNode node1 = new ListNode("A");//        System.out.println(new Main().hasCycle(node1));//false    }}