2015-09-18 4 views
-3

Я пытаюсь создать функцию, которая может вращать связанный список одиночных символов прямо на одно пространство без переустановки каких-либо отдельных узлов, то есть с использованием стратегии копирования данных.Связанный список копирование данных-копирование

Я пробовал несколько способов и по-прежнему не могу создать желаемый результат при печати моего списка.

Пример вывода должен быть:

happy (before rotation) 
yhapp (after rotation) 

Любая помощь будет оценена.

typedef struct _node { 
     char data; 
     strut _node *next; 
} NodeT 


void rightRotation(NodeT *head){ 
    if(head == NULL || head->next == NULL){ 

    }else{ 
     NodeT *temp1=head; 
     NodeT *cur = head; 
     NodeT *prev = head; 
     char t1; 
     while(cur->next != NULL){ 
      cur=cur->next; 
      t1 = cur->data; 
      cur->data=prev->data; 
      prev=prev->next; 
      cur->data=t1; 
     } 
     temp1->data = cur->data; 
    } 
+0

Показать больше кода. Например, мы не знаем, что такое 'NodeT'. –

ответ

1

еще блок смены нравится это:

NodeT *cur = head; 
char t1 = cur->data; 
while(cur->next != NULL){ 
    char t2 = cur->next->data; 
    cur->next->data = t1; 
    t1 = t2; 
    cur = cur->next; 
} 
head->data = t1; 
+0

Это все еще недостаток, заключающийся в том, что вы копируете данные вместо изменения порядка элементов списка. – gmug

+0

@gmug Порядок списка не изменился. OP хочет «без переустановки каких-либо отдельных узлов» – BLUEPIXY

+0

Хотя это может сказать, что такая стратегия является недостатком, если «данные» очень большие или составные. Я думаю, что в этом случае не сказано об этом недостатке ('char data'). – BLUEPIXY

0

В общем, вы должны просто установить next указатель последнего элемента в адрес первого элемента и next указатель второго последнего элемента в NULL и, конечно, указатель на первый элемент список - head->next.

Либо вам понадобится дополнительная информация для вашей функции, либо вам по-прежнему нужно переходить по одному связанному списку: Например, в первом случае вам понадобится в дополнение к адресу элемента головы, адрес второго последний элемент и адрес последнего элемента.

void rightRotation(NodeT *head, NodeT *tail, NodeT *secondLast){ 
    if(head == NULL || head->next == NULL){ 

    }else{ 
     tail->next = head; 
     secondLast->next = NULL; 
    } 
} 

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

void rightRotation(NodeT *head){ 
    if(head == NULL || head->next == NULL){ 

    }else{ 
     NodeT *secondLast = NULL; 
     NodeT *tail = NULL; 
     NodeT *current = head; 

     tail->next = head; 
     secondLast->next = NULL; 

     while(current->next != NULL){ 
      secondLast = current; 
      tail = current->next; 
      current = current->next; 
     } 
     tail->next = head; 
     secondLast->next = NULL; 
    } 
} 
Смежные вопросы