このスラッシュドットのインタビューで、 Linus Torvaldsは次のように語っています。
"prev"エントリを追跡して片方向リンクリストエントリを削除し、そのエントリを削除する人が多すぎます。
if(prev)
prev-> next = entry-> next;
else
list_head = entry-> next;そして、そのようなコードを見るときはいつでも、「この人はポインタを理解していません」とだけ行きます。悲しいことに、それはかなり一般的です。
ポインタを理解している人は、「エントリポインタへのポインタ」を使用して、list_headのアドレスで初期化します。そして、リストをトラバースするときに、「* pp = entry-> next」を実行するだけで、条件を使用せずにエントリを削除できます。
PHP開発者として、私は10年前の大学でのC入門以来ポインタに触れていません。でも、これは少なくとも知っておくべき状況だと思います。Linusは何について話しているのですか?正直なところ、リンクされたリストを実装してアイテムを削除するように求められた場合、上記の「間違った」方法は私がそれについて取り組む方法です。Linusが最もよく言うように、コーディングするために何を知る必要がありますか?
私は実際に本番コードでこれに問題を抱えていないので、スタックオーバーフローではなく、ここで質問します。
prev
ノード全体を格納するのではなく、の場所を格納する必要がある場合は、の場所を格納するprev.next
だけでよいということです。そして、あなたがそうするなら、あなたは愚かなことを避けますif
、なぜならあなたはlist_head
ノードの外からのポインターであるという厄介なケースがないからです。リストの先頭へのポインタは、意味的に次のノードへのポインタと同じです。