0

リンクされたリストを繰り返し逆にする次のコードがあります。

 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;

リストノードの実際のアドレスが変更されるように?

4

1 に答える 1

1

いいえ、すべきではありません。

メモリ内のノードのアドレスを変更する必要はありません (つまり、それらの場所を変更することを意味します)。むしろ、それらが互いにどのように指し合っているか、つまり、各ノードがどのノードを指すかを変更する必要がありますnext。次の行で発生します。

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

を使用する場合list **currNode、次のように言う必要があります。

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

しかし、それは私に何の利益をもたらしましたか?

ノード同士の接続方法を変更するだけで、接続はnext各ノードにあるため、それらの値のみを変更する必要があります。

それが十分に明確であることを願っています:)

于 2011-11-25T10:54:45.813 に答える