0

次のリンクリストの順序を逆にしようとしていますが、逆にしたリストは印刷されないようです。どこが間違っているのですか?

//reverse the linked list
    #include <iostream>
    using namespace std;

    struct node{
        int number;
        node *next;
    };

    node *A;

    void addNode(node *&listpointer, int num){
        node *temp;
        temp = new node;
        temp->number = num;
        temp->next = listpointer;
        listpointer = temp;
    }

    void reverseNode(node *&listpointer){
        node *temp,*current;
        current = listpointer;
        temp = new node;
        while (true){
            if (current == NULL){
                temp = NULL;
                break;
            }
            temp->number = current->number;
            current = current->next;
            temp = temp->next;
        }
        listpointer = temp;
    }

    int main(){
        A = NULL;
        addNode(A,1);
        addNode(A,2);
        addNode(A,3);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }
        cout<< "****" << endl;
        reverseNode(A);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }

        cout<< "****"<< endl;

        return 0;
    }
4

5 に答える 5

3

さて、私が最初に気付くのはあなたがやっているということです

temp=新しいノード

そして、すべての相互作用で:

temp = temp-> next

しかし、temp->nextを割り当てることはありません

したがって、最終的にリストポインタをオーバーライドすると、確かに面白い値が返されます。

于 2010-05-22T09:49:20.863 に答える
1

これをして:

while (true){
    if (current == NULL){
        temp = NULL;
        break;
    }
    temp->number = current->number;
    current = current->next;
    temp = temp->next;
}

意図したとおりに機能するとします。whileが存在する場合、tempそうなるNULLでしょう?

listpointer = temp; <=> listpointer = NULL;

したがって、これは問題になる可能性があります。

于 2010-05-22T09:51:21.767 に答える
0

コードをチェックせずに、これをお願いします。リンクリストが機能していることを確認しますか?

于 2010-05-22T09:49:09.380 に答える
0
void reverse(Node** list) {
    Node* previous=NULL;
    Node* current=*list;
    while (NULL!=current) {
        std::swap(previous, current->next);
        std::swap(previous, current);
    }
    *list=previous;
}
于 2013-03-13T08:41:16.080 に答える
-1

なぜだめですか :

  1. リストの長さを測定する

  2. 既存のリストの2倍のサイズに達するまで、リストの追加をゼロで埋めます

  3. リストの最初に移動し、

  4. 元のリストの最後に到達するまで、内容を1つずつ読みます

  5. 元のリストに移動している間:

  6. 現在のノードの内容を、ポインタが次のように進むノードにコピーします。

    ((元のリストの長さ-現在のノードインデックス)* 2 + 1)*ノードのサイズ

  7. 完了したら、元のリストの後の最初のノードのポインターを取得して、反転したリストをポイントします

新しいリストを作成したり、複数の反復で作業したり、既存のデータ構造を変更したりする必要はありません(二重リンクリストに変換しないでください)。

于 2010-05-22T10:06:51.927 に答える