【问题标题】:Get node value in linkedlist from end in c从c的末尾获取链表中的节点值
【发布时间】:2018-02-09 15:33:01
【问题描述】:

我正在做这个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

【问题讨论】:

  • 你需要返回一个整数,因为你的函数原型是这样说的。我认为信息很明确。
  • 是的,但是(return head->data)是一个整数。
  • 你在哪里 return 有什么事吗?您确实知道return 声明吗?也许你应该read a couple of good books
  • 您的函数需要在每个 if 条件下都返回一个整数,或者您可以简单地在函数末尾返回一个整数。这里的问题是编译器认为当条件 if(p== positionFromTail) 永远不会为真时没有返回任何内容。

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


【解决方案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];
}

【讨论】:

    【解决方案2】:

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

    如果最初的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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多