2016-10-21 2 views
-1

Я пытаюсь изменить один связанный список с этим кодом, но его не работает должным образом. Следующий код не работает в том случае, когда размер списка равен двум, в противном случае он работает хорошо. Я не могу найти ошибку в этом коде и потратил много времени на нем. Пожалуйста, скажите мне, что случилось с этим кодом?Как отменить односвязный список на C++?

void list::reverse() 
{ 
    node *current = head; 
    if (current->next != NULL) 
    { 
     node *move = current->next; 
     while (move->next != NULL) 
     { 
      node *temp = move->next; 
      move->next = current; 
      if (current == head) 
      { 
       current->next = NULL; 
      } 
      current = move; 
      move = temp; 
     } 
     if (move->next == NULL) 
     { 
      move->next = current; 
      if (current == head) 
      { 
       current->next == NULL; 
      } 
      head = move; 
     } 
    } 
} 
+2

Когда вы попадаете на полпути вниз по своему списку, что, по-вашему, имеет значение следующего? – UKMonkey

+2

Что вы наблюдали при проверке кода с помощью отладчика? –

+0

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

ответ

0

У вас есть:

A (== голова) -> B -> C -> D

Вы хотите (?):

D (== голова) - > C -> B -> A

Я полностью потерялся в вашем алгоритме, не могу понять, как он будет работать, или как легко его исправить. На самом деле мне трудно поверить, что это работает для более длинных списков. Но слишком ленив, чтобы попробовать.

Может быть, попытаться понять этот (в псевдо C++), выглядит проще мне ?:

src = head; 
reversed = nullptr; 
while (nullptr != src) { 
    // node to insert at the beginning of reversed list 
    to_prepend = src; 
    // iterate trough all nodes in normal direction 
    src = src->next; 
    // now insert the currently read node at the head of reversed list 
    to_prepend->next = reversed; 
    reversed = to_prepend; 
} 
head = reversed; 

я не написал код + отладки, поэтому не может гарантировать правильность, но она должна работать как это:

А (== голова) -> B -> C -> D

  1. ток: А, обратный ток нулевой, обновлен до в (А-> в), А-> реверсировать (nullptr), reverse = A
  2. ток: B, обратный A, ток до C (B-> C), B-> обратный (A), обратный = B
  3. ток: C, обратный B-> A, ток до D, C-> обратный (в), обращенной = C
  4. ток: D, обратный С-> В-> А, ток nullptr, D> обращенную (с), обращенной = D
  5. ток: nullptr: выход в то время как
  6. head = reverse (= D-> C-> B-> A-> nullptr).

Также в вашем коде на:

current->next == NULL; это логическое выражение, метание результат прочь, не делая ничего.

+1

Вы можете попытаться «нарисовать» те же шаги, что и я для вашего кода, возможно, это поможет вам понять, что происходит с вашим кодом. – Ped7g

+0

Да, я уверен, что если вы нарисуете весь процесс, вы найдете легкое решение своей цели – Roberto

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