今天去小米面试,面试官最后出了一道算法题,就是判断单向链表中是否有环?如下所示:无环链表和有环链表的区别。
我当时没有想到别的办法,就是说用一个容器HashSet来装遍历的节点,然后判断如果发现容器中包含了当前节点,那么就认为是有环的,遍历可以结束,否则遍历结束没有发现包含节点的,就是无环。
面试官小姐姐特意说,如果链表中有重复关键字的节点,比如关键字为c的节点,怎么办呢?我说容器中装的是节点对象的引用,不是一个个孤立的没有任何关系的对象。小姐姐好像觉着这种办法不对。
后来,觉着这个办法应该是可以的,于是,模拟了一个有环链表和无环链表。通过Java实现了我的猜想,发现是可以判断的。
package com.xxx.algorithm;
import java.util.HashSet;
import java.util.Set;
public class LinkedListCircleDemo {
public static void display(Node head){
if(head==null)
return;
Node cur = head;
System.out.print("list:");
int count = 0;
while(cur!=null){
System.out.print(cur+"->");
cur = cur.next;
//这里是为了不让链表遍历