从链表中的最后一个返回第5个元素?

时间:2011-10-22 16:28:33

标签: c++ linked-list

在我的采访中向我提出了上述问题。 虽然我还在等待结果,但我想知道我的方法是否正确或是否有更好的解决方案?

 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);    
   }    

如果您有更好的最佳解决方案,请在此处发布。 谢谢大家 萨姆

3 个答案:

答案 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。