[编辑]修正了我的代码。是while(temp!= NULL),而不是while(temp-> next!= NULL)。很抱歉插入错误的代码。
今天我参加了在线编程测试。采访者使用Codility评估我的代码和其他受访者。 在某个时刻,关于链接列表的问题已经提出。它将计算链表有多少项。 我做了唯一可行的方法,AFAIK:
//This is struct declaration
struct SomeStruct
{
int value;
SomeStruct* next;
}
int elementCount(SomeStruct* list)
{
int count = 0;
if(list != NULL)
{
SomeStruct* temp = list;
while(temp != NULL)
{
count++;
temp = temp->next;
}
}
return count;
}
我记得当我发送这段代码作为这个问题的答案时,Codility指出这个解决方案是错误的,因为它耗费了太多时间来执行任务。 在我的脑海和this thread中,在没有遍历它的情况下,没有其他方法可以获得链表的大小,而不是以简单的方式。
当Codility说这个解决方案有问题时是否存在问题?还是有另一种方法?
PS:测试允许使用STL
答案 0 :(得分:6)
您的解决方案不正确,因为它比实际计数少1。只需尝试将其应用于包含1个元素的列表。
为什么你提出这个奇怪的双层结构if
和一个检查temp->next
的周期?为什么不呢
unsigned elementCount(const SomeStruct *list)
{
unsigned count = 0;
for (const SomeStruct *temp = list; temp != NULL; temp = temp->next)
++count;
return count;
}
我怀疑您决定将list
指向的元素视为未使用和保留的“标头”元素。实际上,有时以这种方式执行实现列表可能是有意义的。但我看到你的帖子中没有说明的内容。他们是否告诉你专门对待它?
答案 1 :(得分:3)
您不必为每次迭代评估间接temp->next
两次。
你可以简单地做
int count( SomeStruct const* pNode )
{
int result = 0;
while( pNode != 0 )
{
++result;
pNode = pNode->next;
}
return result;
}
此外,作为WhozCraig notes,您的代码在逻辑上是错误的(通过一个结果产生关闭),而不仅仅是潜在的低效。
答案 2 :(得分:2)
Codility可能正在使用循环链接列表进行检查,在这种情况下,您的代码将永远不会结束。
使用STL可以实现这一点,因为它有一个List<>用尺寸方法。