Я не вижу здесь преимущества рекурсии, итерация будет работать так же хорошо. Это было вечно с тех пор, как я написал C (и нет простого способа проверить следующее на наличие синтаксических ошибок ... или cringe дампов ядра, но вы поймете))
node *reversed_list(node *list) {
node *fwd=list;//Purely for readability
node *last=null;
node *next=null;
node *rev=null;
do {
//Cache next
next=fwd->next;
//Set current
rev=fwd;
//Reset next to point back
rev->next=last;
//Update last
last=fwd;
//Forward ptr;
fwd=next;
} while (fwd!=null);
return rev;
}
Уверен, ваш *list
бесполезен после того, как вы вызвали его, поскольку теперь он указывает на последний элемент списка, который имеет ->next=null
, может просто обновить его вместо возврата указателя.
Обновление (для рекурсивного решения)
Как уже говорили другие, ваш новый хвост испорчен (указывает на последний элемент, но должен указывать на ноль) ... и вы не возвращаете правильную голову, вы возвращаете второй элемент. Рассмотрим список a->b->null
с вашим алгоритмом:
p=a,
c=b;
c=
p=b
c=null
return b; //b->null
c=b
c->next=a //b->a
return a; //a->b, b->a, a returned
//But what you wanted is a->null, b->a, and b returned
Исправит следующий обновленный код:
node *reverse_list_recursive(node *list)
{
node *parent = list;
node *current = list->next;
if(current == NULL)
return parent;
else
{
current = reverse_list_recursive(current);
current->next = parent;
parent->next=null; //Fix tail
printf("\n %d %d \n",current->value,parent->value);
return current; //Fix head
}
}
Со списком a->b->null
:
p=a,
c=b;
c=
p=b
c=null
return b; //b->null
c=b
c->next=a //b->a
p->next=null //a->null
return b; // b->a->null