次の2つのコードは、新しいノードをリンクリストに挿入するのと同じ働きをしますか?バージョン1においてリンクリスト:再帰を使用してノードを挿入
、新しいノードに前のノードを巻くことができるprev
ポインタがあります。
しかし、バージョン2ではそれが表示されません。バージョン2では、前のリンクが壊れています(つまり、新しいノードにリンクしていません)。何か不足していますか?
次の2つのコードは、新しいノードをリンクリストに挿入するのと同じ働きをしますか?バージョン1においてリンクリスト:再帰を使用してノードを挿入
、新しいノードに前のノードを巻くことができるprev
ポインタがあります。
しかし、バージョン2ではそれが表示されません。バージョン2では、前のリンクが壊れています(つまり、新しいノードにリンクしていません)。何か不足していますか?
のは、あなたのバージョン2の挿入を掘り下げてみましょう:作業が呼び出しによって行われているので
void RecInsertSorted(Entry*& list, Entry* newOne) {
if (list == nullptr || newOne->name < list->name) {
newOne->next = list;
list = newOne;
else {
RecInsertSorted(list->next, newOne);
}
}
あなたはprev
は必要ありません。何故ですか? list
パラメータはポインタへの参照であるためです。
newOne
を最初の要素と2番目の要素の間に挿入するとします。終わりに、あなたはあなたのリストは次のようになりたい:
要素1 - > newOne - >要素2
条件newOne->name < list->name
が満たされ
は、list
の要素2を指します。しかしこれはポインタへの参照です、参照はelement1-> nextを参照しています!したがって、文list = newOne;
が実行されると、それに応じてelement1->next
が更新され、リストが整形されます。
同様に、末尾にnewOne
を挿入する場合、list
はnullptr
です。しかし、もう一度参考になるので、newOne->next
がnullptr
になり、newOne
がリストの最後になります。
また、newOne
を最初の要素の前に挿入する必要がある場合は、head
ポインタを更新してリストの先頭を追跡します。したがって、リストの最初の要素になります。
who upvotesそれのようなもの? –
ソースコードのスクリーンショットではなく、実際にソースコードを投稿してください。 –