2011-12-16 8 views
1

リンクリストを逆にすることに関して質問がありますが、私は自分の実装でこれを理解しようとします。C++リンクリストの逆転 - ポインタが進まない

私のコードは意味があり、うまくいくはずですが、デバッガを実行するとループは無限に実行されます。具体的には、headnextはリンクされたリストの第1ノードと第2ノードの間を交互に保持します。 getLink()メソッドは、ノードのポインタ(リスト内の次のノードを指している)を返します。 whileループの下のコメントに基づいた入力は役に立ちます。

これはどのように
void revNodes(IntNodePtr& head) 
{ 
    IntNodePtr prev = NULL; 
    IntNodePtr next = NULL; 
    next = head; 
    while (next != NULL) 
    { 
     prev = head; 
     // this should advance the pointer head to the next node in the list because next is the same as head initially 
     head = next->getLink(); 
     // advance the pointer next to node after it 
     next = next->getLink(); 
     // set the pointer in the node that head is pointing to to prev (head before head was advanced) 
     head->setLink(prev); 
    } 
} 

答えて

0

効果的には、リストの先頭の後にある最初のノードを指しているので、そのノード上のポインタをリストの先頭に設定します(head->setLink(prev))。したがって、ループを次回通過するときには、headnextの両方が元のヘッドノードに戻ってきます!

を変更した場合:あなたは、リストをが、を進めることができるようになります

あなたがheadを設定すると、あなたは、次のノードをジャンプします:

next = next->getLink(); 

next->getLink()になります。最初にnexthead->getLink()に初期化し、ループ内にheadnextと設定し、上記のようにnexthead->getLink()と設定してください。

だから、コードにそれを回す:

void revNodes(IntNodePtr& head) 
{ 
    IntNodePtr prev = NULL; 
    IntNodePtr next = NULL; 
    next = head->getLink(); 
    while (next != NULL) 
    { 
     prev = head; 
     // this should advance the pointer head to the next node in the list 
     head = next; 
     // advance the pointer next to node after it 
     next = next->getLink(); 
     // set the pointer in the node that head is pointing to to prev (head before head was advanced) 
     head->setLink(prev); 
    } 
} 
+0

これはかなり意味があります。私の最初の戦略は、ヘッドが前のノードを指していたノードの中のポインタをポイントして同時に「次へ」を進めることができるように、「次の」という形で「ヘッド」の「コピー」を作成することでした。しかし、私と頭が同じノードを指していたことに気づきませんでした! –

0

:あなたはheadnextを初期化して、ループ内であなたが同じノードに両方のポイントにそれらを設定している

void revNodes(IntNodePtr&head) 
{ 
    IntNodePtr prev = NULL; 
    IntNodePtr next = NULL; 
    IntNodePtr p = head; 
    while (p){ 
     next = p->getLink(); 
     p->setLink(prev); 
     prev = p; 
     p = next; 
    } 
    head = prev; 
} 
0

あなたのアルゴリズムには二つの問題があります。

  1. リストの先頭の要素は逆リストの最後の要素になるだろう、あなたはそうはそのリンクをNULLに設定する必要があります。

  2. ループの最初の反復で、2番目の項目のリンクを最初のものに変更しましたが、次の項目(この場合は3番目の要素)へのポインタを進めませんでした。

関連する問題