1

私はポインタでより簡単になろうとしています。そこで、楽しみのために、リンクされたリストを値で分割する次の C++ 関数を使用しました。

void partitionList(lnode<int> *& head, int val) {
    lnode<int> * front = nullptr;
    lnode<int> * back = nullptr;
    lnode<int> * curr = head;

    while (curr) {
        lnode<int> * next = curr->next;
        if (curr->data < val) {
            curr->next = front;
            front = curr;
        } else {
            curr->next = back;
            back = curr;
        }
        curr = next;
    }

    curr = front;
    while (curr->next) {
        curr = curr->next;
    }
    curr->next = back;
    head = front;
}

代わりにCスタイルのダブルポインターを取るように変更しようとしました。私は無知な検索置換を行いましたが、うまくいきませんでした。調べてみると、問題の原因がわかりましたが、何が起こっているのかまだよくわかりません...

void partitionList(lnode<int> ** head, int val) {
    lnode<int> * front = nullptr;
    lnode<int> * back = nullptr;
    lnode<int> ** curr = head;

    while (*curr) {
        lnode<int> * entry = *curr;

        std::cout << (*curr)->data << std::endl; // On second loop, prints 2
        std::cout << entry->data << std::endl; // On second loop, prints 2

        lnode<int> * next = entry->next; // This assignment does something

        std::cout << entry->data << std::endl; // On second loop, prints 2
        std::cout << (*curr)->data << std::endl; // On second loop, prints 3!

        if ((*curr)->data < val) {
            (*curr)->next = front;
            front = *curr;
        } else {
            (*curr)->next = back;
            back = *curr;
        }
        curr = &next;
    }

    *curr = front;
    while ((*curr)->next) {
        (*curr) = (*curr)->next;
    }
    (*curr)->next = back;
    head = &front;
}

int main() {
    lnode<int> * tail = new lnode<int>(8, nullptr);
    lnode<int> * seven = new lnode<int>(7, tail);
    lnode<int> * six = new lnode<int>(6, seven);
    lnode<int> * five = new lnode<int>(5, six);
    lnode<int> * four = new lnode<int>(4, five);
    lnode<int> * three = new lnode<int>(3, four);
    lnode<int> * two = new lnode<int>(2, three);
    lnode<int> * head = new lnode<int>(1, two);

    partitionList(&head, 6);
}

最初のループでは、関数の while ループの先頭付近にある 4 つのデバッグ出力行すべてが「1」を出力します。ただし、2 番目のループでは、「2」、「2」、「2」、「3」と出力されます。

誰が何が起こっているのか説明できますか? ポインターへの参照の代わりにダブルポインターを使用する正しい方法は何ですか?

ありがとう!

4

1 に答える 1