判断一个链表是否有环--剑指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 } }
相关文章推荐
- 剑指offer面试题15——扩展2:判断一个单向链表是否形成环结构
- 判断一个链表中是否有环
- Linked List Cycle 判断一个链表是否存在回路(循环)
- 判断一个单向链表中是否有环
- 如何判断一个单向链表是否有环路?
- 【笔试/面试】—— 判断一个链表是否有环
- 判断一个链表是否有环引发出的思考
- 判断一个单向链表中是否存在环
- 链表面试题(九)---判断一个链表是否带环
- 判断一个链表是否回文(每日一道算法题)
- 判断一个单向链表是否有环
- 判断一个单向链表中是否存在环
- 《剑指offer》:[22]如何判断一个序列是否为栈的弹出序列
- 判断一个单向链表中是否有环
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 【题目13】判断一个链表是否存在环
- 判断一个单向链表上是否有环
- 【转载】判断两个链表是否相交、一个链表是否有环
- 判断一个链表是否有环,如果有环返回环开始的结点指针
- 判断一个链表是否有环