2011-09-23 73 views
0

我想使用遞歸來反轉鏈接列表。我寫了一個函數「逆(節點* PTR)對這個 我正在爲40 40 20的輸出,同時我期望輸出爲40,20,10,低於 是發佈的代碼。使用遞歸的反向鏈接列表

class list { 
    //some code; 

    void reverse() 
    { 
     node* temp = new node; 
     temp =first; 
     reverse(temp); 
     temp =NULL; 
     delete temp; 
    } 

    void reverse(node* ptr) { 


     if(ptr->next != NULL) 
     { 
      ptr =ptr->next; 
      reverse(ptr); 
     } 
     cout << ptr->data << endl; 
    } 
    // some code; 
}; 

int main() 
{ 
    list ll; 
    ll.insert(18); 
    ll.insert(20); 
    ll.insert(40); 
    ll.display(); 
    ll.reverse(); 
    return 0; 
} 

請建議我在做什麼錯在這裏。

感謝

+0

'node * temp = new node; temp = first;'導致內存泄漏,你分配一個新的節點,然後你「忘記」它失去了它的地址[注意不解決你的問題,這是一個不同的問題] – amit

+1

你試過*調試*? – n0rd

回答

0

你應該擺脫線的ptr =ptr->next;

主要目的是打印所有打印實用之前,在當前節點之後到來的節點ting當前節點的值。因此,只需撥打reverse(ptr->next),然後撥打cout<<ptr->data<<endl就足夠了,因爲第一次呼叫會在ptr之後處理所有節點。因爲我們想在最後打印當前節點,所以不需要提前指針。

+0

Thanks..it工作對我來說:) – Ruchi

1

甚至談論鏈表之前,有一個與你的代碼的一個主要問題:

void reverse() 
{ 
    node* temp = new node; 
    temp =first; 
    reverse(temp); 
    temp =NULL; 
    delete temp; 
} 

您的node分配空間,然後改變它指向的,到first。這意味着你分配的內存將被泄漏。不僅如此,而且你將它設置爲NULL,然後嘗試釋放它。你不能釋放NULL!

我相信你只是意味着:

void reverse() 
{ 
    reverse(first); 
} 

簡單。到鏈表:

if(ptr->next != NULL) 
{ 
    ptr =ptr->next; 
    reverse(ptr); 
} 

您設置ptr到下一個元素,所以當reverse()的回報將是未來的一個元素。我相信你的意思是:

if(ptr->next != NULL) 
{ 
    reverse(ptr->next); 
} 
+0

好吧...... 爲我改變了它的第二個: void反轉(節點* PTR){ 如果(!ptr->未來= NULL){ 反向(PTR ); } count << ptr-> data << endl; } 仍然我得到同樣的問題。 – Ruchi

+0

@Ruchi查看我的編輯。我不小心忘了' - > next'。 – quasiverse