Создайте шахматную доску или «Переплетите» два связанных списка. IE изменение указателей двух связанных списков - PullRequest
0 голосов
/ 03 февраля 2020

Итак, у меня есть два связанных списка, каждый из которых содержит цвет:


1.черный-> 2.черный-> 3.черный-> 4.черный-> 5.черный-> NULL

1.red -> 2.red -> 3.red -> 4.red -> 5.red -> NULL


Я хочу, чтобы функция возвращала


1.черный-> 2.red -> 3.black-> 4.red -> 5.black-> NULL

1.red -> 2.black-> 3. красный -> 4.black-> 5.red -> NULL.


Позволяет назвать первые указатели, firstBlack и firstRed. Чтобы добиться этого паттерна «шахматной доски», я переключаю узлы, на которые каждый сначала указывает, простым переключением на другой список, перемещаю указатель на две точки, затем повторяюсь, пока я не нахожусь в конце списка.

while(firstBlack->next != NULL && firstRed->next != NULL) {
   Node * temp = firstBlack->next;
   firstBlack->next = firstRed->next;
   firstRed->next = temp;

   firstBlack = firstBlack->next->next;
   firstRed = firstRed->next->next;
}

Однако эта функция не выполняет то, что должна, хотя я вполне уверен, что мои логики c верны. Я также получаю ошибки сегмента: (

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Вы продвигаетесь на два шага без проверки конечных условий. Поскольку у вас нечетное количество элементов, вы разыменовываете нулевой указатель.

Вам не нужно заботиться о том, какой хвост возник в каком списке, чтобы поменять их местами

for(; left->next && right->next; left = left->next, right = right->next) {
    std::swap(left->next, right->next);
}
0 голосов
/ 03 февраля 2020

Это достаточно простой код, пожалуйста, используйте отладчик и пошагово отлаживайте код. Также, пожалуйста, опубликуйте весь код, а не только то, что в данный момент. L oop.

Этот код должен работать правильно.

//Some methods to create these linked lists.
pBlackHead = CreateBlackList();
pRedHead = CreateRedList();

firstBlack = pBlackHead;
firstRed = pRedHead;

while(firstBlack->next != NULL && firstRed->next != NULL){
Node * temp = firstBlack->next;
firstBlack->next = firstRed->next;
firstRed->next = temp;

firstBlack = firstBlack->next;
firstRed = firstRed->next;}

При печати списка для проверки правильности используйте pBlackHead , pRedHead , Отладчик в настоящее время недоступен в системе, которую я использую, но это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...