2010-12-08 15 views
0

削除されるノードへのポインタのみが与えられている場合、リンクされたリストのノードを削除するにはどうすればよいですか?リンクされたリストの削除

+1

、単一リンクのリストを?二重リンクリスト? – Jon

+3

単独でリンクされたリストを複製する場合:http://stackoverflow.com/questions/1960562/delete-a-node-in-singly-link-list二重にリンクされたリストの場合...インタビューで尋ねる価値はありません:) – codaddict

+1

また、リストのオブジェクトが何か大きい場合(つまり、些細ではない、あるいは高価なコピーコンストラクタ)、その複製からの解決策は醜いハックです。そこにcodaddictの記事を見てください。非実用的なインタビューの質問は実用的ではありません。 :) – Kos

答えて

6

質問があまりにも曖昧であり、その理由(たとえば、データ構造の実際の知識をテストするのではなく、会話を生成するなど)の可能性があります。彼らはあなたに「これは二重にリンクされたリストですか、単独でリンクされたリストですか?」と尋ねることを期待しています。それは二重にリンクされたリストである場合は、その単純な問題:それは単独リンクリストである場合は、リスト内の前のノードを見つけることができるように

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; 
2

リストヘッドを指すポインタがないと、単独リンクリストではほとんど不可能だと思います。常にリンクされたリストの先頭ポインタを持つべきです。

+0

あなたが引数として前任者を与える場合、質問にコメント内のcodaddictによって与えられたスレッドで、ノードを削除する方法があります。 –

+0

ヘッドポインタを持っている必要がありますが、1つのリンクリストからアイテムを削除することは不可能ではありません(ただし、技術的に次のアイテムを現在のアイテムにコピーして、次のアイテムを削除します)。二重にリンクされたリストの場合、頭や尾のポインタを使わずに削除するのは簡単です。 –

+0

だから私はほとんど不可能とコメントを書いた。あなたが気づいたように、この方法は本当にノードの削除ではありません。あなたが削除したノードの隣のノードへのポインタがあれば、それを使って何かしようとすると、セグメンテーションフォールトが発生します。私には受け入れられません。 –

1

標準のリンクリストの実装では、にはがあり、削除するノードを指すノードを変更します。それを変更するには、最初にそれを見つける必要があります。リストヘッドへのポインタ、または削除される前の要素があれば、そのリストをトラバースすることで見つけることができます。そうでない場合、この問題に対する一般的な解決策はありません。

リンクされたリストの定義を変更して、削除されたノードを何らかの形で(たとえば、ブール値属性deletedで)マークし、そのようなノードをスキップするようにリストトラバーサルを変更することができます。

3

まあ、それは単なるトリックです。

to_delete = curr->next 
curr->data = to_delete->data 
curr->next = to_delete->next 
delete to_delete 

本質的にこれだけデータをコピーし、リスト内の次のノードの次のポインタ現在のノードの次のノードを削除しますcurrを仮定

は擬似コードであろう次の、与えられたアドレスです。

+0

OPは 'curr'を削除したいのですが、' curr-> next'は削除したくありません。それ以外の場合、問題は非常に簡単です。 ;) – AlcubierreDrive

+0

同じトリックを使用して、現在のノードの前に挿入し、その後にノードを挿入してからデータをスワップすることができます。他の誰かがノードへのポインタを保持している場合、ノードが削除されたか、またはそのデータが変更された場合、この方法で問題が発生します。 – Jackson

+0

私は自分自身がこの質問に直面していると私は彼が実際にノード自体ではなく、値を削除するつもりだと思う:)(少なくともこれは私からの期待だった)。 – mukeshkumar

1
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... 
1

これが尾でない場合は解決策があります。

単独リンクのリストの場合は、自分の隣のノードと「交換」して、代わりにそのノードを削除します。

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によって示されていると仮定すると、前のノードをテールにすることができないため、解決できません。

関連する問題