您的位置:首页 > Web前端

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

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

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

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息