看下java源码就知道,真的没有:
private static class Entry <E> { E element; java.util.LinkedList.Entry<E> next; java.util.LinkedList.Entry<E> previous; Entry(E e, java.util.LinkedList.Entry<E> entry, java.util.LinkedList.Entry<E> entry1) { /* compiled code */ } } |
它是一个私有静态类,你无法从外部实例化它。你不能直接操控next和prev,因为它们俩代表了链表的状态,它们就该这样被封装起来。
如果你真的把链表搞成有环了,那说明你写错。写错的话,你最好重新写对它,而不是写个“检测环”的方法。
“检测环”的方法就该这样写:
public class LinkedList { public boolean containsCycle() { return false; } } |
如果你的链表写对的话,“龟兔算法”返回的结果也跟这个方法一样。
现实中你是很少有机会亲手写个链表的,即使有,你也别写个能造成环的方法。造成环的方法,只能是“留后门”,“元编程”,“反射”。既然是这样故意的话,那么绕过你的“检测环”也是轻而易举的。
结论
很多面试题,都中了以上其中一点,太过困难或者与工作无关。
而这个问题,两点都中了。
如果有人给到你满意的答案,就说明那个人死记硬背,无他。因回答不了而被你否决的人,说不定还比你更适合这份实务。
链表环路检测:别问了。
更新:有位评论者说如果问题问的是有向图,且每个节点的出度最多只有,即是问“检测这个有向图有没有环”。搞图的话,你确实可能会向API用户提供修改每点的指向的方法,这看上去符合实际。但是,还是那句话,你只是在考察应聘者把CS课程记住了多少,或者你只想随便问问,又或者你想听听他说除了龟兔算法以外的低效算法。