2014-02-25 38 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

我根据我的假设给出了我的答案。如果我的假设是错误的,请提供更多细节。这将有助于找出问题。 –