Эта строка непосредственно перед тем, как вы напечатаете «задачу 4»:
this->head_->next = othernode;
должно быть
pre->next->next = othernode;
break;
Вы не хотите менять, head_
, если список не пуст. Но вы ранее проверяли это. Таким образом, вы знаете, что список не пуст на данный момент в коде.
Узел, который вы хотите изменить, - это узел перед current
, то есть pre->next
в этой точке. pre->next->next
- это current
, то есть nullptr
. Вы хотите установить это на othernode
.
Вам также нужно добавить еще else
:
} else {
break;
Это обрабатывает случай, когда current
не нуль, а othernode
. В этом случае, вы сделали. Но ваш код будет продолжать цикл.
Лучшим решением может быть изменение while
на
while (current != this->head_ && othernode != other.head_) {
и избавиться от внутреннего if
. Затем вы можете проверить
if (othernode != other.head_) {
после цикла while
. Тогда просто сделай
pre->next->next = othernode;
Это избавит от break
.
Это также избавляет от проверок и назначений nullptr
.
Следующий код также проблематичен.
current = current->next;
othernode = othernode->next;
opre = othernode->prev;
onex = other.head_->next->next;
pre = current->prev;
nex = current->next;
current->next = othernode;
othernode->prev = current;
nex->prev = othernode;
othernode->next = nex;
current = nex;
othernode = onex;
Вам не нужен current = current->next
, так как он продвигает указатель, и вы уже выдвинули его как head_->next
или nex
. Так что просто избавьтесь от этой строки и othernode = othernode->next
.
onex = other.head_->next->next;
Как и ранее, это не должно ссылаться на head_
. Это делает его одинаковым на каждой итерации. Всего
onex = othernode->next;
Я думаю, что это все, но я не пытался запустить его. Там может быть больше ошибок, которые я не заметил.