リンクされたリストを反復的に逆にしながらリストがどのように変更されるかを理解しようとする

私はリンクされたリストを反復的に逆転させる次のコードを持っています。

 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;

リストノードの実際のアドレスは変更されますか?

0

1 答え

私たちはしてはいけません。

メモリ内のノードのアドレス(場所の変更を意味します)を変更するのではなく、どのノードがどのノードを指しているか、次の行で発生する next

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

list ** currNode を使用すると、次のようになります。

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

しかし、私には何が役立ったのですか?

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

十分に明確になることを願っています:)

1
追加された
私は一度質問をしたら、同じことを理解しました。ノード内の情報を変更することができます。これには、次にポインタ変数に含まれるアドレスが含まれます。
追加された 著者 curryage,