Попытка понять, как список изменяется, итеративно обращаясь к связанному списку - PullRequest
0 голосов
/ 25 ноября 2011

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

 struct list {  
   int elem;
   list *next;
 };
  /* .... */

void ReverseListIterative(list **listref) 
{

    list *currNode = *listref;
    list *prevNode = NULL;
    list *nextNode = NULL;

    while(currNode) {
        *listref = currNode;
        nextNode = currNode->next;
        currNode->next = prevNode;      
        prevNode = currNode;
        currNode = nextNode;
    }   
}

В коде currNode, prevNode и nextNode - все указатели, локальные для ReverseListIterative ().Как получилось, что первоначальный список все еще изменяется (если быть более точным)?Разве мы не должны использовать

 list **currNode;
 list **prevNode;
 list **nextNode;

, чтобы фактические адреса узлов списка были изменены?

1 Ответ

1 голос
/ 25 ноября 2011

Нет, мы не должны.

Вы не хотите изменять адреса узлов в памяти (что означает изменение их местоположения), а скорее как они указывают друг на друга, то есть: на какой узел указывает каждый узел, и это делается с помощью изменение next, которое происходит в следующих строках:

nextNode = currNode->next;
currNode->next = prevNode;

Если мы используем list **currNode, я должен сказать:

*nextNode = currNode->next;
*currNode->next = prevNode;

Но что это принесло мне пользу?

Мы меняем только то, как узлы соединены друг с другом, и соединения next в каждом узле, поэтому следует изменять только их значения.

Надеюсь, это достаточно проясняет :)

...