削除されるノードへのポインタのみが与えられている場合、リンクされたリストのノードを削除するにはどうすればよいですか?リンクされたリストの削除
答えて
質問があまりにも曖昧であり、その理由(たとえば、データ構造の実際の知識をテストするのではなく、会話を生成するなど)の可能性があります。彼らはあなたに「これは二重にリンクされたリストですか、単独でリンクされたリストですか?」と尋ねることを期待しています。それは二重にリンクされたリストである場合は、その単純な問題:それは単独リンクリストである場合は、リスト内の前のノードを見つけることができるように
curr->prev->next = curr->next;
curr->next->prev = curr->prev;
delete curr;
は、あなたがヘッドノードを持っている必要があります。だから彼らはあなたがヘッドノードへのポインタを持っているかどうか尋ねることを期待しているでしょう。擬似コードは次のようになります。また
loop from head to end until test->next == curr
test->next = curr->next;
delete curr;
、あなたは(ヘッドノードなし)のリストを変更することができた場合:
temp = curr->next;
curr->data = temp->data;
curr->next = temp->next;
delete temp;
リストヘッドを指すポインタがないと、単独リンクリストではほとんど不可能だと思います。常にリンクされたリストの先頭ポインタを持つべきです。
あなたが引数として前任者を与える場合、質問にコメント内のcodaddictによって与えられたスレッドで、ノードを削除する方法があります。 –
ヘッドポインタを持っている必要がありますが、1つのリンクリストからアイテムを削除することは不可能ではありません(ただし、技術的に次のアイテムを現在のアイテムにコピーして、次のアイテムを削除します)。二重にリンクされたリストの場合、頭や尾のポインタを使わずに削除するのは簡単です。 –
だから私はほとんど不可能とコメントを書いた。あなたが気づいたように、この方法は本当にノードの削除ではありません。あなたが削除したノードの隣のノードへのポインタがあれば、それを使って何かしようとすると、セグメンテーションフォールトが発生します。私には受け入れられません。 –
標準のリンクリストの実装では、にはがあり、削除するノードを指すノードを変更します。それを変更するには、最初にそれを見つける必要があります。リストヘッドへのポインタ、または削除される前の要素があれば、そのリストをトラバースすることで見つけることができます。そうでない場合、この問題に対する一般的な解決策はありません。
リンクされたリストの定義を変更して、削除されたノードを何らかの形で(たとえば、ブール値属性deleted
で)マークし、そのようなノードをスキップするようにリストトラバーサルを変更することができます。
まあ、それは単なるトリックです。
to_delete = curr->next
curr->data = to_delete->data
curr->next = to_delete->next
delete to_delete
本質的にこれだけデータをコピーし、リスト内の次のノードの次のポインタ現在のノードの次のノードを削除しますcurr
を仮定
は擬似コードであろう次の、与えられたアドレスです。
OPは 'curr'を削除したいのですが、' curr-> next'は削除したくありません。それ以外の場合、問題は非常に簡単です。 ;) – AlcubierreDrive
同じトリックを使用して、現在のノードの前に挿入し、その後にノードを挿入してからデータをスワップすることができます。他の誰かがノードへのポインタを保持している場合、ノードが削除されたか、またはそのデータが変更された場合、この方法で問題が発生します。 – Jackson
私は自分自身がこの質問に直面していると私は彼が実際にノード自体ではなく、値を削除するつもりだと思う:)(少なくともこれは私からの期待だった)。 – mukeshkumar
You have a pointer to that node (say, node N). Meaning, you have access on that node.
If that node has pointer to it's front node and it's back node, then simply point the back node to the front node. And the front node to the back of your node N.
To illustrate:
step 1:
---> [ node ] ---> [ node ] ---> [ node ] --->
<--- [ M ] <--- [ N ] <--- [ O ] <--- etc...
step 2:
---> [ node ] -----------------> [ node ] --->
<--- [ M ] <--- [node N] <--- [ O ] <--- etc...
step 3:
---> [ node ] -----------------> [ node ] --->
<--- [ M ] <----------------- [ O ] <--- etc...
[ node ] ---> (still points to node O)
(still points to node M) <--- [ N ]
step 4:
just point Node N to NULL
[ node ] ---> NULL
NULL <--- [ N ]
result:
---> [ node ] -----------------> [ node ] --->
<--- [ M ] <----------------- [ O ] <--- etc...
これが尾でない場合は解決策があります。
単独リンクのリストの場合は、自分の隣のノードと「交換」して、代わりにそのノードを削除します。
void freeNode(Node * node)
{
Node * next = node->next;
if(next)
{
node->value = next->value;
node->next = next->next;
free(next);
}
// else I'm stuck!
}
CおよびC++の擬似ミックスの上記の並べ替え:私は
struct Node
{
T value;
Node * next;
};
ソリューションのようなものになるだろう持っていると仮定すると、
。
私たちが持っているノードがテールであり、テールがnode-> next == NULLによって示されていると仮定すると、前のノードをテールにすることができないため、解決できません。
- 1. リンクされたリスト削除メソッド
- 2. 単独リンクされたリストのリストを削除する
- 3. リンクされたリストからのノードの削除
- 4. リンクされたリストの10000番目のノードを削除する
- 5. リンクされたリストの検索と削除の方法
- 6. リンクされたリストからトップノードを削除し、別のリンクされたリストの先頭に置く方法は?
- 7. 単独でリンクされたリストのlastNodeを削除する
- 8. リンクされたリストの削除ノードが機能しない
- 9. リンクされたリストのアイテムを削除する
- 10. リンクされたリストのヘッドノードを削除する
- 11. リンクされたリスト内のノードを削除する
- 12. Proguard:削除されたリスト
- 13. C89リンクされたリストを削除する
- 14. リンクされたリストからノードを削除する(
- 15. リンクされたリストからアイテムを削除する
- 16. リンクされたリストからノードを削除する方法は?
- 17. リンクが削除されたdrupalテーブル
- 18. リンクされたリストの最初の要素を削除してください
- 19. リンクされたリストからアイテムを削除してもリストボックスから削除されない
- 20. リスト内の唯一のノードである場合、リンクされたリストのヘッドを削除する。単独でリンク
- 21. リンクされたリストを削除した後もまだ印刷中です
- 22. リンクされたリストの所定の位置にあるノードを削除する
- 23. リンクされたリストのすべての要素を削除する
- 24. リンクされたリストからどのようにノードを削除しますか?
- 25. リンクされたリストから単一の学生を削除する
- 26. リンクされたリスト
- 27. Python:リンクされたリストを完全に削除する方法は?
- 28. リンクされたリストから正しい要素を削除するには?
- 29. リンクされたハッシュセットが削除されない
- 30. Cのリンクされたリスト
、単一リンクのリストを?二重リンクリスト? – Jon
単独でリンクされたリストを複製する場合:http://stackoverflow.com/questions/1960562/delete-a-node-in-singly-link-list二重にリンクされたリストの場合...インタビューで尋ねる価値はありません:) – codaddict
また、リストのオブジェクトが何か大きい場合(つまり、些細ではない、あるいは高価なコピーコンストラクタ)、その複製からの解決策は醜いハックです。そこにcodaddictの記事を見てください。非実用的なインタビューの質問は実用的ではありません。 :) – Kos