2013-05-09 2 views
0

Я решить проблему реверсирования связанного списка в группах заданного размера и алгоритма я использую выглядит следующим образом:реверсирования связанного списка в группах заданного размера

1) Реверс первого подспискома размера k. При обратном я сохранил следы следующего узла и предыдущего узла. Пусть указатель на следующий узел будет следующим, а указатель на предыдущий узел будет предварять & указатель на текущий узел - это ptr.

2) голова = реверс (следующий, к) -Recursively вызов для остальной части списка

3) возвращение предыдущая которое новый глава обращенного списка

Мой пример кода:

struct node *reverse(struct node *start,int k) 
{ 
    struct node *prev,*ptr,*next; 
    prev=NULL; 
    ptr=start; 
    int count=0; 
    while(count<k && ptr!=NULL) 
    { 
     next=ptr->link; 
     ptr->link=prev; 
     prev=ptr; 
     ptr=next; 
     count++; 
    } 

    if(next!=NULL)//recursive call 
    start=reverse(next,k); 

    return prev; 
} 

Но мой вывод только для первой половины списка!

для например: Если мой список: 98 74 94 857 8 7

My output is : 94 74 98(The rest is not being displayed) 

Где я неправильно .. Является ли этот метод правильно?

+0

Что означает «реверсирование в группах»? Переверните каждую группу, сохраняя относительный порядок групп неизменными? Или изменить относительный порядок групп, сохраняя порядок внутри каждой группы без изменений? – AnT

ответ

2

Когда вы делаете рекурсивный вызов:

if(next!=NULL)//recursive call 
    start=reverse(next,k); 

return prev; 

вы сохраните результаты рекурсивного вызова в start, который вы никогда не ссылаться снова. Указатель истекает, когда управление переходит из функции, и результаты рекурсивного вызова (то есть ничего, кроме первых k элементов) теряются. Перед возвратом вы должны добавить эти результаты в восстановленный под-список.

Смежные вопросы