2017-08-31 159 views
0

我這樣做hackerrank問題(https://www.hackerrank.com/challenges/get-the-value-of-the-node-at-a-specific-position-from-the-tail) 我的代碼如下 -獲取節點值從最終在C

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 
+1

需要,因爲你的函數的原型是這麼說的,返回一個整數。我認爲這個信息很清楚。 –

+0

是的,但(return head-> data)是一個整數。 – shreyaa

+0

你在哪裏***'return' ***什麼?你*知道'return'語句嗎?也許你應該[讀幾本好書](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)? –

回答

0

每個可能離開函數的分支都需要返回一個值。

如果初始的head->next應該是NULL那麼您編碼的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; 
} 
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]; 
}