从c中的end结束获取链表中的节点值

时间:2017-08-31 15:47:32

标签: c function return return-value return-type

我正在做这个hackerrank问题(https://www.hackerrank.com/challenges/get-the-value-of-the-node-at-a-specific-position-from-the-tail) 我的代码如下 -

int GetNode(Node *head,int positionFromTail)
{
  Node *prev = NULL;
  Node *current = head;
  Node *next;
  while(current!=NULL){
     next = current->next;
     current->next = prev;
     prev = current;
     current = next;
  }
  head = prev;
  int p=0;
  while(head->next!=NULL){
    if(p== positionFromTail){
        return head->data;
    }
    else {
        p++;
        head= head->next;
    }
  } 
}

所以我所做的是,我首先颠倒了链表,然后循环查找特定位置,然后打印其值。这样做是否正确? 它给了我这个错误。

  solution.cc: In function ‘int GetNode(Node*, int)’:
  solution.cc:42:1: error: control reaches end of non-void function [Werror=return-type]
   }
   ^
   cc1plus: some warnings being treated as errors

2 个答案:

答案 0 :(得分:1)

问题陈述使得代码无法在不返回值的情况下到达函数的末尾,因为这个约束:

  

约束

     

位置将是链表中的有效元素。

但是,C编译器不知道您的while循环在到达NULL时永远不会退出,从而保证return head->data最终会被执行,因此会发出错误。

您可以通过在结尾处提供未使用的return或使您的循环无限来解决此问题。

注意:您的解决方案会反转列表,这可能不是最佳的。当您遍历列表一次时,可以通过在数组中存储positionFromTail + 1尾随项来避免反转:

int GetNode(Node *head,int positionFromTail) {
    int data[++positionFromTail], p = 0;
    while (head) {
        data[p] = head->data;
        head = head->next;
        p = (p+1) % positionFromTail;
    }
    return data[p];
}

答案 1 :(得分:0)

每个可能离开函数的分支都需要返回一个值。

如果初始head->nextNULL,则无法联系到您编码的return语句。

设计代码以使函数只有一个可能的出口点。

这可能如下所示:

/* returns pay-load or INT_MIN if list is empty or searched pos is negativ*/

int GetNode(Node *head, int positionFromTail)
{
  int result = INT_MIN;

  ...

  while (head->next != NULL) {
    if(p == positionFromTail) {
      result = head->data;
      break;
    }
    else {
      p++;
      head = head->next;
    }
  } 

  return result;
}