检查链表是否有环,貌似目前的标准答案是使用两根指针。下面是Emacs中的实现,亮点在指针变量命名。
/* Signal `error' with message S, and additional arg ARG.
If ARG is not a genuine list, make it a one-element list. */
void
signal_error (const char *s, Lisp_Object arg)
{
Lisp_Object tortoise, hare;
hare = tortoise = arg;
while (CONSP (hare))
{
hare = XCDR (hare);
if (!CONSP (hare))
break;
hare = XCDR (hare);
tortoise = XCDR (tortoise);
if (EQ (hare, tortoise))
break;
}
if (!NILP (hare))
arg = Fcons (arg, Qnil); /* Make it a list. */
xsignal (Qerror, Fcons (build_string (s), arg));
}
在Emacs源码中搜索tortoise,可以发现多处类似实现。






这好像是著名的面试题, 有个不太靠谱的答案 就是 比如小链表 那就让它转10秒钟之类的,要是能停下 就没环, 停不下有环