我面试时遇到的一道题

whoamami 2004-01-29 09:22:23
题目如下:

struct _list{
struct _list *next;
};
给定以上的数据定义,请写一个过程,判断链表中是否有环路。
int CheckCycle(struct _list *list)
{
//请在此填上你的代码
}

我觉得很奇怪,如果在结构定义中增加一个成员,表示是否被访问过,则此题十分简单,且函数效率也很高;现在恐怕必须借助其它数据结构了,而且效率很低下。难道我的理解有问题?请各位大侠指点。
...全文
50 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnefuil 2004-01-29
  • 打赏
  • 举报
回复
很久以前微创出过这题,我还是听同学说的
不知道现在又是哪个公司把这题拿出来唬人了
gnefuil 2004-01-29
  • 打赏
  • 举报
回复
很简单,用两个指针,以不同的步长在里面走,如果有环路这两个指针一定会相遇的
如果没有环路,步长长的那个指针一定会先结束,所以两者不会相遇
这样时间复杂度为O(n),空间复杂度为O(1)

pacman2000 2004-01-29
  • 打赏
  • 举报
回复
对于链表的节点,总是要从头节点开始往后访问一遍的。就是把访问过的节点地址记下来。所以没有什么巧妙的办法。
whoamami 2004-01-29
  • 打赏
  • 举报
回复
两位说得有道理;但我总是怀疑是不是有“巧妙”的解法?
goodsong 2004-01-29
  • 打赏
  • 举报
回复
链表中有环路等价于链表中没有空指针,但这个不能用来判断
还等价于有两个指针(包括传入的参数指针)指向同一个节点(值相等)
我们可以用这个条件来判断
效率等于插入排序的效率
不知道用哈西表来做怎样,忘了哈西表的定义了
frankzch 2004-01-29
  • 打赏
  • 举报
回复
你的想法没有错,但是不符合出题目人的意思,他已经给定了数据结构,所以你不能用改变数据结构的方法来完成这个题目;可以使用你认为“效率低下”的其他方法
gnefuil 2004-01-29
  • 打赏
  • 举报
回复
如果x和y是输入的变量,而且是一步一步走的
那么复杂度就应该是O((x+y)*n)
gnefuil 2004-01-29
  • 打赏
  • 举报
回复
时间复杂度一定是O(n)的
证明:
设两个指针的步长为x和y, x不等于y
如果把走x步,和走y步分别算作一次操作的话
设每个指针从开始到相遇所需要的操作的个数为k
那么就是如下一个同余方程
k*x=k*y (mod n) k>=1
显然当k=n的时候上面的式子一定成立
因此每个指针所需要的操作的个数至多为n
如果x步和y步是一步一步走的,那么所需要走的步数是x*n+y*n步
如果x步和y步是一次完成的,那么只需要2*n次操作
因此时间复杂度为O(n)
whoamami 2004-01-29
  • 打赏
  • 举报
回复
明白了,“如果有环路这两个指针一定会相遇的”这句话是对的,因
为可能在环路上转了不止一圈之后,两个指针才相遇。时间复杂度应
该和步长的选择有关,应该如何选择呢?
whoamami 2004-01-29
  • 打赏
  • 举报
回复
to mysword(一怒拔剑)
“如果有环路这两个指针一定会相遇的”,这句话不对吧?
我自己画了个有环路的链表,不同步长的两个指针在移动,结果并
没有相遇。
sevencat 2004-01-29
  • 打赏
  • 举报
回复
这条题目正常的解法不难,但面试人员会逐渐加上各种限制,最后一般人肯定会被难倒。是一条老的命试题目了。
goodsong 2004-01-29
  • 打赏
  • 举报
回复
to mysword(一怒拔剑)
不错
以不同的步长在里面走
一个每次移一步,一个每次移两步
如果移两步得指针为空,无环
如果两个指针相等,有环
又学了一招

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧