2011-12-11 100 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'并且工作了。 –