2015-05-21 25 views
2

我知道有關於同樣的問題上有多個問題。但在某個地方,我無法獲得邏輯。扭轉一個單一的鏈接列表

能逆轉鏈表中的功能如下:

void reverse() 
{ 
    struct node *curr=head, *prev=NULL; 
    while(curr!=NULL) 
    { 
     curr->next = prev; 
     prev = curr; 
     curr = curr->next; 
    } 
    head = prev; 
} 

我使用鏈表中的一個全局頭指針和節點的結構是:

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

struct node *head = NULL; 

這裏,每當curr節點將指向prev節點,並且在curr節點遍歷列表的最後,prev節點將指向列表中作爲頭指針的最後一個節點。

但是,此邏輯不會反轉列表並僅打印第一個節點。所以,我認爲代碼只執行一次,但我無法捕捉到這個錯誤。

其他功能,使程序完整:

#include <stdio.h> 
#include <stdlib.h> 

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

struct node *head = NULL; 

void add(int n) 
{ 
    struct node *temp = (struct node*)malloc(sizeof(struct node)); 
    temp->data = n; 
    temp->next = NULL; 
    if(head == NULL) 
    { 
     head = temp; 
     return; 
    } 
    temp->next = head; 
    head = temp; 
} 

void print() 
{ 
    struct node *temp = head; 
    printf("\n The List is : "); 
    while(temp!=NULL) 
    { 
     printf(" %d ",temp->data); 
     temp = temp->next; 
    } 
} 

void reverse() 
{ 
    struct node *curr=head, *prev=NULL; 
    while(curr!=NULL) 
    { 
     curr->next = prev; 
     prev = curr; 
     curr = curr->next; 
    } 
    head = prev; 
} 

int main(void) 
{ 
    add(1); 
    add(2); 
    add(3); 
    add(4); 
    add(5); 
    print(); 
    reverse(); 
    print(); 
    return 0; 
} 
+0

強烈建議您完成打印'()用'的putchar(「\ n」)'函數;'或結束輸出線的其他方式。否則,您的輸出可能不會及時顯示。 –

+0

@JonathanLeffler你能否詳細說明一下? –

+0

許多程序以行緩衝輸出模式運行,這意味着直到末尾有換行符纔會顯示輸出。在Windows上它可能不那麼重要,但在Unix上,這絕對是一個問題。功能完成其輸出線通常也更加整潔。其他函數可以假定它們的輸出將在一行的開始處開始。換行符之前和之後的空格也不是最理想的,但這是另一個問題。通常,確保在輸出結束時打印換行符,而不是在開頭。 –

回答

5

要覆蓋curr->next指針,然後將其用於迭代列表。代碼應該是更多這樣的:

void reverse() 
{ 
    struct node *curr=head, *prev=NULL; 
    struct node *next; 
    while(curr!=NULL) 
    { 
     next = curr->next; 
     curr->next = prev; 
     prev = curr; 
     curr = next; 
    } 
    head = prev; 
}