ВОт у меня есть два кода, они выполняют одно и то же. Но первый работает должным образом, а второй нет. Не могу понять, почему это так.В чем разница в последних двух строчках? Чем отличается
(*p)->next = nexts.back();
p = &(nexts.back()->next = tmp);
nexts.pop_back();
от этого
(*p)->next = nexts.back();
nexts.back()->next = tmp;
p = &nexts.back();
nexts.pop_back();
Здесь самы коды в полной мере:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution1 {
public:
void reorderList(ListNode* head) {
ListNode* current = head;
vector<ListNode*> nexts;
while(current != NULL){
nexts.push_back(current);
current = current->next;
}
if(nexts.size() < 2)
return;
auto** p = &head;
while(true){
auto* tmp = (*p)->next;
if(tmp == nexts.back() || *p == nexts.back()){
nexts.back()->next = NULL;
break;
}
(*p)->next = nexts.back();
p = &(nexts.back()->next = tmp);
nexts.pop_back();
}
}
};
class Solution2 {
public:
void reorderList(ListNode* head) {
ListNode* current = head;
vector<ListNode*> nexts;
while(current != NULL){
nexts.push_back(current);
current = current->next;
}
if(nexts.size() < 2)
return;
auto** p = &head;
while(true){
auto* tmp = (*p)->next;
if(tmp == nexts.back() || *p == nexts.back()){
nexts.back()->next = NULL;
break;
}
(*p)->next = nexts.back();
nexts.back()->next = tmp;
p = &nexts.back();
nexts.pop_back();
}
}
};
В первом случае после выполнения кода p
указывает на nexts.back()->next
, а во втором - на nexts.back()
. Это совершенно разные места в памяти. Вот и вся разница.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть классы Deck(колода) и Card(карточка)Задача при добавлении карты в колоду обновить описание колоды
Пример из книги РЛафоре
Имеется приложение, которое выводит содержимое переменной окружения:path