Ваш код будет работать только для этого типа цепи:
... -> prev_p -> p -> ... -> prev_q -> q ->...
или
... -> prev_q -> q -> ... -> prev_p -> p ->...
Но не будет работать, если у вас есть такие ситуации:
... -> prev_p -> p -> q -> ....
или
... -> prev_q -> q -> p ->...
Используя код, вы в конечном итоге с петлей внутри связанного списка в обоих ситуации (... prev_p -> q -> q
для первого и ... prev_q -> q -> q
для второй ситуации).
Перед изменением next
полей prev_p
или prev_q
вы должны сначала проверить, если это не соответственно q
или p
иначе вы будете в конечном итоге с неловких ситуаций, описанных выше. Так что ваша вторая часть вашей функции должна быть что-то вроде:
if (prev_q == p){
q->next = p;
else{
if(prev_q){
prev_q->next = p;
}else{
// q has no parent -> q was the head -> p must become new head
}
}
if (prev_p == q){
p->next = q;
else{
if(prev_p){
prev_p->next = q;
}else{
// p has no parent -> p was the head -> q must become new head
}
}
EDIT, если р или д может быть глава списка, они не будут иметь родителя. prev_q
или prev_p
будет NULL (см. Ваш pastebin)
PS: Эта проблема не возникнет, если вы замените данные вместо обмена ссылками. Как вы сказали (в своем описании) вы не хотите менять данные, я дам вам подумать, нужно ли менять тактику или нет.
«Не знаю, работает ли моя логика или нет» - проверьте. – MayurK
* «Проблема в том, что я не знаю, работает ли моя логика или нет». Итак, напишите тестовый пример, пройдите через него в отладчике и посмотрите, работает ли он или нет. –
ну, тест пока не сработал, я обнаружил проблемы с отслеживанием предыдущего узла мин и тока в моей функции сортировки –