首页  编辑  

IBM考试题目

Tags: /Misc.杂项/   Date Created:

内存中存有一单向链表,要求不许分配额外内存,

但可以使用寄存器保存有限的几个变量,对内存作只读访问,

设计一个算法,复杂度为O(n),求出该链表中是否有环。

:mikedeakins 时间:01-3-2 18:07:03 ID:463796  

一个游标每次移动一个元素,另一个每次移动两个。

如果重合就有环。很难么?

:mataijin 时间:01-3-2 19:52:10 ID:463902  

你看行不行:

我取表头的地址放在一个寄存器,然后指针顺着移动,有与表头地址相同的就是环

:Pipi. 时间:01-3-2 23:16:11 ID:464050  

我觉得mikedeakins的对。

一个比较差的方法,用3个寄存器,一个保存碰到的最大地址,一个保存碰到的最小地址,

一个保存走的步数,要是能结束当然没有环了,要是 步数>最大地址-最小地址 说明有环,

否则就一直走下去直到结束为止(能结束说明没环)

:howardqu 时间:01-3-3 4:36:59 ID:464088  

mikedeakins的算法应该可以,应该多判断一步:

a=head;

b=head->next;

while (1) {

 if (a==b) return -1; //有环

 if (b==null) return 0; //正常

 a=a->next;

 b=b->next;

 if (a==b) return -1; //有环

 b=b->next;

}

:Crab 时间:01-3-5 17:56:54 ID:465237  

mikedeakins 的方法是对的,如果有环,第二个指针总会追上第一个,这时两者地址相同。

算法空间是 0(n) 的,但我还没证明出。

pipi 的做法不一定对,因为链表元素不一定是按序存放的,地址可能完全杂乱无章

:Pipi. 时间:01-3-14 21:25:58 ID:470428  

我记住了最大的地址和最小的地址,举个例子,

最大是2000,最小的是1000,那么里面放的东西不会超过2000-1000+1=1001

个,如果里面有环,不停移动下去,步数会超过个数。