2011-12-11 86 views
1

任務是反轉鏈接列表,因此我建立鏈接列表,然後打印出來,然後是所有反轉函數,然後再打印出它。但是,第二張照片是空的。我認爲這是指針問題,任何人都可以解釋?謝謝。反轉鏈接列表

void reverseLinkedList(struct node** head) { 
    struct node* curr, *prev, *temp; 

    curr = *head; 
    prev = NULL; 

    while (curr) { 
     temp = prev; 
     prev = curr;   
     curr = curr->next; 
     prev = temp; 
    } 
    *head = prev; 
} 

struct node* buildLinkedList(int list[], int len) { 
    struct node* head = NULL; 
    struct node* tail = NULL; 
    struct node* node; 
    int i; 

    for (i = 0; i < len; i++) { 
     node = (struct node*) malloc(sizeof(struct node)); 
     node->data = list[i]; 
     node->next = NULL; 

     if (!head) { 
      head = node; 
     } else { 
      tail->next = node; 
     } 
     tail = node; 
    } 
    return head; 
} 

void printLinkedList(struct node** head) { 
    struct node* s = *head; 
    while(s) { 
     printf("%d\t", s->data); 
     s = s->next; 
    } 
    printf("\n"); 
} 

int main() { 
    int list [6] = {6,7,8,3,4,5}; 
    struct node* header = NULL; 
    header = buildLinkedList(list, 6); 
    printLinkedList(&header); 
    reverseLinkedList(&header); 
    printLinkedList(&header); 

} 

結果我從控制檯得到的是:

6  7  8  3  4  5 

其中第二printLinkedList正在打印什麼。想知道問題在哪裏。謝謝。在你的函數扭轉名單

+0

您是否單步執行代碼並觀察調試器中的數據更改?這在尋找錯誤時可以幫助很大。 – Tony

+0

投票結束:您可以通過逐步調試調試器中的代碼或添加一堆printf語句來告訴您中間變量的狀態,從而解決此問題。 –

回答

6

看你有

while (curr) { 
    temp = prev; 
    prev = curr;   
    curr = curr->next; 
    prev = temp; // <<-- this resets prev to what it was before. 
} 

你永遠不變的next指針,但你改變prev兩次。

+0

謝謝。是的,我改變了最後一個'prev-> next = temp'並且工作了。 –