Не могу понять, где разница в двух кодах

132
11 сентября 2019, 18:50

ВОт у меня есть два кода, они выполняют одно и то же. Но первый работает должным образом, а второй нет. Не могу понять, почему это так.В чем разница в последних двух строчках? Чем отличается

   (*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();
        }
    }
};
Answer 1

В первом случае после выполнения кода p указывает на nexts.back()->next, а во втором - на nexts.back(). Это совершенно разные места в памяти. Вот и вся разница.

READ ALSO
Избавиться от лишнего if

Избавиться от лишнего if

Есть классы Deck(колода) и Card(карточка)Задача при добавлении карты в колоду обновить описание колоды

176
Преимущество передачи по значению

Преимущество передачи по значению

Отрывок из C++ Core Guidelines:

117
Clion и cmake:изменить (добавить) переменную окружения перед запуском приложения

Clion и cmake:изменить (добавить) переменную окружения перед запуском приложения

Имеется приложение, которое выводит содержимое переменной окружения:path

97