# 判断环形链表

说明:给定一个链表,判断链表中是否有环,有环则为 true,没有则 false

思路:Java 中有 Set 集合是不可以重复放同一个物品的,所以可以利用这个来写;判断环形,那么就可以说使用快慢指针,一个指针走的快,一个指针走的慢,那么如果有环的话,这两个指针就一定会相遇。

// 链表类
class ListNode {
    Object data;
    ListNode next;
    public ListNode() {
        this.data = null;
        this.next = null;
    }
    public ListNode(Object data, ListNode next) {
        this.data = data;
        this.next = next;
    }
}

# 使用 Set 来判断

// 判断连边是否为空或者链表是否只有一个元素
if (head == null || head.next == null) {
    return false;
}
static boolean SetCycle(ListNode head){
    // 定义 Set 及其内容类型
    Set<ListNode> set = new HashSet<>();
    while (head!=null){
        // 利用 Set 如果放入同样的对象就会返回 FALSE 的性质,来判断是否有环
        if (!set.add(head)){
            return true;
        }
        head = head.next;
    }
    return false;
}
// 主方法
 public static void main(String[] args) {
        ListNode node5 = new ListNode(5, null);
        ListNode node4 = new ListNode(4, node5);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        ListNode node1 = new ListNode(1, node2);
        node5.next = node3;
        System.out.println(SetCycle(node1));
    }
// 控制台输出 : true

# 利用快慢指针

static boolean pointer(ListNode head) {
    // 判断连边是否为空或者链表是否只有一个元素
    if (head == null || head.next == null) {
        return false;
    }
    // 定义快慢指针
    ListNode slow = head, quick = head.next;
    // 判断快慢指针是否会相等
    while (slow != quick) {
        // 因为快指针在前面并且快指针是一步走 2 个节点,所以要判断他自己以及他的下一个是否为空值
        if (quick == null || quick.next == null) {
            return false;
        }
        // 实现快慢速度
        slow = slow.next;
        quick = quick.next.next;
    }
    return true;
}
// 主方法和控制台输出都和上面的那个一样

有待更新…