如何判断链表是否有环

来源:互联网 发布:java视频直播技术架构 编辑:程序博客网 时间:2024/05/21 09:58

141. Linked List Cycle

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

使用一个数组、Map记录访问过的结点,可以解决但是消耗了空间。

package solutions._141;import utils.ListNode;import java.util.HashSet;import java.util.Set;public class Solution {    public boolean hasCycle(ListNode head) {        Set<ListNode> set = new HashSet<>();        while (head != null) {            if (set.contains(head)) {                return true;            } else {                set.add(head);            }            head = head.next;        }        return false;    }    public static void main(String[] args) {        ListNode node1 = new ListNode(3);        ListNode node2 = new ListNode(2);        ListNode node3 = new ListNode(0);        ListNode node4 = new ListNode(-4);        node1.next = node2;        node2.next = node3;        node3.next = node4;        node4.next = node1;        System.out.println(new Solution().hasCycle(node1));    }}

或者可以使用两个快慢指针,一个每次步进1,一个每次步进2。
如果存在环的话,会有相遇的情况。否则快指针率先遇到null(存在环的话一定不存在next为null的结点)

package solutions._141;public class Solution {    public boolean hasCycle(ListNode head) {        if (head == null) {            return false;        }        ListNode slow = head;        ListNode fast = head;        while (fast != null && fast.next != null) {            fast = fast.next.next;            slow = slow.next;            if (fast == slow) {                return true;            }        }        return false;    }
原创粉丝点击