**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;
}**
в моем случае описанный выше метод удаления никогда не работает.
Я обновил весь свой код, чтобы предоставить более подробную информацию. Это часть реализации MergeSort по связанному списку. И мой тестовый пример — это рекурсия, и эта функция слияния — это list1 = {2} и list2 = {4} , поэтому функция слияния предназначена для возврата заголовка связанного списка {2,4}, который имеет размер двух узлов.
В приведенном выше коде я объявил новый узел для путешествия->следующий в каждом из моих операторов if и перемещаю путешествие на один шаг вперед. Следовательно, после цикла while мой связанный список становится {2,4,0}, и у меня есть указатель "путешествовать", указывающий на ListNode{0}. Однако его нельзя удалить! Я пробовал как «удалить результат-> следующий-> следующий», так и «удалить путешествие», но он все равно может вернуть результат-> следующий-> следующий-> val, который равен 0! (мое последнее заявление cout)
ЗАЧЕМ?
Я объявил этот новый ListNode (который является структурой) в моей куче памяти. И я хочу удалить этот ListNode из цикла while. Но мое удаление никогда не работает. Может быть, перемещение было в куче в скобках, но получилось как память стека после цикла while, потому что я объявляю динамическую память в своем цикле?
std::move()
) - person Elazar   schedule 25.02.2014ListNode::~ListNode
) пытаетсяdelete next
, ноnext
не инициализируется нулем в конструкторе. Чтобы исправить это, просто инициализируйтеnext
нулем в конструкторе. - person Dialecticus   schedule 25.02.2014shared_ptr
/unique_ptr
или дажеauto_ptr
(для C++03), а не необработанный указатель - person Bryan Chen   schedule 25.02.2014