1

たとえば、次のような演習があります。

そのポインターのみが与えられた場合に、リンクされたリストからノードを削除する関数を作成します

そして、これが解決策です:

void deleteNode(Node* toDelete) {

    // this function essensially first copies the data from the next pointer
    // and then, deletes the next pointer
    // However, it doesn't work if trying to delete the last element in the list

    Node *temp = toDelete->next;    // create a temp, assign to the one after toDelete
    toDelete->data = temp->data;    // change toDelete's data to the one's after it
    toDelete->next = temp->next;    // change toDelete's next to the one's after it

    delete temp;
    temp = nullptr;
}

ポインターの最後のノードのみを指定して、リンクされたリストの最後の要素を削除できるようにソリューションを変更するにはどうすればよいですか?

4

3 に答える 3

8

明らかにできません。前のノードは有効なノードを指しており、それを変更する方法はありません。

できることは、番兵ノードをリストの最後に追加することです。そのノードを削除したり、データを保存するために使用したりすることはありません。その後、ソリューションはすべてのデータ ノードで機能します。これにはノード構造を変更する必要はありませんが、リストを反復処理する方法を変更する必要があります。

于 2013-08-07T07:20:46.890 に答える
3

いいえ、片方向リストではできません。

その理由は、最後から 2 番目のノードを変更する必要があるためです (nextポインターを null にするため)。しかし、最後のノードからそのノードを見つける方法はありません。

一般に、ノードへのポインターだけが与えられた場合、単一リンク リストからノードを削除することはできません。

指しているノードを実際に削除していないため、現在行っていることは本質的に「チート」です。リストを変更してから、指定されたノードの後継者を削除しています。これは、この関数を呼び出すときにコードのどこかに他のビットがその後継者へのポインターを保持している場合に違いを生みます-それらのポインターは無効になります。したがって、指しているデータ要素を削除していますが、指しているノードは削除していません。

于 2013-08-07T07:18:10.863 に答える