在我的采访中向我提出了上述问题。 虽然我还在等待结果,但我想知道我的方法是否正确或是否有更好的解决方案?
struct Node
{
int data;
Node * next;
};
Node *function( struct Node *head)
{
if ( ! head)
{
std::cout <<" no linked present";
return 0;
}
Node *current, *temp;
temp = NULL;
current = head;
int counter = 0;
while( current != NULL)
{
counter ++;
current = current->next;
if( counter >= 5)
{
if( temp == NULL)
temp = head;
else
temp = temp->next;
}
}
return (temp);
}
如果您有更好的最佳解决方案,请在此处发布。 谢谢大家 萨姆
答案 0 :(得分:1)
对于单链表,您的解决方案应该是最佳的。对于双链表,你可以从后面开始。
答案 1 :(得分:1)
如果排除列表长度小于5个元素的情况,我会说下一个解决方案更优雅一点,但它基本上是一样的:
Node *function( struct Node *head)
{
while ( head->next->next->next->next )
head = head->next;
return head
}
在性能方面,对于单链表,您不能比O(n)
做得更好,所以可以改进的是可读性。
编辑:
Vlad在评论中提出了一个有趣的观点,即在循环的每次迭代中都会执行更多指令。我认为这是错误的,因为指针访问只需要1个asm指令。但是,在OP的代码中: counter ++;
current = current->next;
if( counter >= 5)
{
if( temp == NULL)
temp = head;
else
temp = temp->next;
}
是循环中执行的指令。这样效率较低。增量,2个指针分配和2个比较...
两者都是O(n)
,但对于大输入,时间是4 * n还是10 * n很重要。
答案 2 :(得分:-1)
看起来它会正常工作。唯一的问题是你没有在你的代码中声明temp,并且没有将它初始化为NULL。