2014-02-25 41 views
0
**struct ListNode { 
     int val; 
     ListNode *next; 
     ListNode(int x) : val(x), next(NULL) {} 
    }; 
ListNode* Merge(ListNode* list1, ListNode* list2){//list1 2; list2 4 
    ListNode* result = new ListNode(0); 
    ListNode* travel = result; 
    while(list1 || list2){ 
     cout << "hereWhile" << endl; 
     //cout << list1->val << list2->val << endl; 
     if(!list1){ 
      travel->val = list2->val; 
      list2 = list2->next; 
      travel->next = new ListNode(0); 
      travel = travel->next; 
     } 
     else if(!list2){ 
      travel->val = list1->val; 
      list1 = list1->next; 
      travel->next = new ListNode(0); 
      travel = travel->next; 
     } 
     else{ 
      if(list1->val <= list2->val){ 
       travel->next = new ListNode(0); 
       travel->val = list1->val; 
       list1 = list1->next; 
       travel = travel->next; 
      } 
      else{ 
       travel->next = new ListNode(0); 
       travel->val = list2->val; 
       list2 = list2->next; 
       travel = travel->next; 
      } 
     } 
    } 
    cout << "travel at the end: " << (travel == result->next->next) << endl; 
    delete result->next->next; 
    //delete travel; 
    cout << travel->val << endl; 
    cout << result->val << endl; 
    cout << result->next->val << endl; 
    cout << "val: " << result->next->next->val << " end" << endl; 

    return NULL; 
}** 

在我的情況下,上面的刪除方法從來沒有工作。在C++中刪除指針讓我困惑

我已更新我的整個代碼,以提供更多的細節。這是通過鏈表實現MergeSort的一部分。而我的測試用例就是這種遞歸,這個合併函數是list1 = {2}和list2 = {4},所以合併函數的目的是返回一個鏈表{2,4}的頭部,它的大小爲兩個節點。

在我上面的代碼中,我宣佈了一個新的節點,用於在我的每條if語句中travel-> next,並且我移動更遠一步。因此,在while循環之後,我的鏈表變爲{2,4,0},並且我有一個指向ListNode {0}的指針「travel」。但是,它不能被刪除!我嘗試了「刪除結果 - >下一步 - >下一步」和「刪除行程」,但它仍然可以返回結果 - >下一步 - >下一步 - > VAL,這是0! (我最後一個cout聲明)

爲什麼?

我在我的堆內存中聲明瞭這個新的ListNode(這是一個結構體)。我想從while循環中刪除這個ListNode。但我的刪除從不起作用。也許旅行在堆棧中,但在while循環之後作爲堆棧內存出來,因爲我在循環中聲明瞭動態內存?

+2

請顯示您的其他代碼。 – dasblinkenlight

+0

是什麼讓你覺得刪除失敗? – Barmar

+0

請插入完整的函數或至少顯示更多的上下文 – 4pie0

回答

0

使用這種循環中,以防止內存泄露

<pointer to struct for list2> tmp1 = list2; 
list2 = list2->next; 
delete tmp1; 
<pointer to struct for travel> tmp2 = travel; travel = travel->next; 
delete tmp2; 
+1

@Elazar我不這麼認爲。如果「某個結構」具有析構函數會發生什麼? – ikh

+0

好吧,考慮到析構函數,編輯版本會更好,我猜 – mangusta

0

我有一些問題。

  1. 是否刪除整個旅行列表或單個節點?
  2. 旅行的初始值是多少?
  3. 您正在檢查list1,但不在循環中使用它。提供更多關於它的細節。

我假設你需要刪除整個旅行列表(list1),旅行是列表1的迭代程序。

travel = list1; 
while(list1 != NULL) 
{ 
    list1 = list1->next; 
    delete travel; 
    travel = list1->next; 
} 
+0

我根據我的假設給出了我的答案。如果我的假設是錯誤的,請提供更多細節。這將有助於找出問題。 –