2016-09-10 107 views
0

下面是爲了顛倒鏈表。它似乎工作,直到它到達最後一行。當我調試時,「當前」和「結果」是相同的類型(節點*)和「結果」是顛倒的列表。但是當函數完成時,當前只有「結果」列表的第一個值。任何人都知道爲什麼「當前」不是函數完成時的完整列表?指針有點麻煩

struct Node { 
    int data; 
    Node* next; 
}; 

void reverseList(Node** head) 
{ 
    Node* current = *head; 
    Node* result = NULL; 

    while (current != NULL) 
    { 
     Node* temp = current; 
     current = temp->next; 
     temp->next = result; 
     result = temp; 
    } 

    current = result; 
} 
+1

什麼是「原創」? – Chris

回答

3

有與顯示邏輯多個問題。

我們可以從明顯的觀察開始,顯然reverseList的目標是顛倒單鏈表。

第二個觀察結果是該函數採用單個參數,一個指向頭節點的指針,它返回void

從,我們得出結論,該函數應該更新head節點,但代碼中沒有這樣做。

此外,真的沒有理由爲什麼這個函數應該像這樣的雙指針,指向頭節點的指針,並更新它。函數更簡單的方法是使用普通指針指向列表的第一個元素,即現有的指針head,然後返回反轉列表的指針。

有了這個簡單的變化,產生的邏輯就變得非常非常短,簡單:

Node *reverseList(Node *head) 
{ 
    Node *current=NULL; 

    while (head) 
    { 
     Node *next=head->next; 

     head->next=current; 
     current=head; 

     head=next; 
    } 
    return current; 
} 

就是這樣。

+0

好的謝謝山姆的評論! – cpd1

2

你需要在你的算法的最後更新頭:

current = result; 
*head = current; 
+1

或者只是'* head = result;' – Barry

+0

是的,巴里!我也只是在想。多謝你們!我想我需要離開電腦一點。 – cpd1